Comment détecter la chaîne utf-8 malformée en PHP?

iconv fonction de parfois me donne une erreur:

Notice:
iconv() [function.iconv]:
Detected an incomplete multibyte character in input string in [...]

y a-t-il un moyen de détecter qu'il y a des caractères illégaux dans la chaîne utf-8 avant de mettre des données à inconv ?

18
demandé sur hakre 2011-07-17 15:36:23

4 réponses

tout d'abord, Notez qu'il n'est pas possible de détecter si un texte appartient à un encodage non désiré spécifique. Vous pouvez uniquement vérifier si une chaîne est valide dans un codage donnée.

vous pouvez utiliser la vérification de validité UTF-8 disponible dans preg_match [PHP Manual] depuis PHP 4.3.5. Il sera de retour 0 (pas d'information supplémentaire) si une chaîne non valide est donné:

$isUTF8 = preg_match('//u', $string);

une Autre possibilité est mb_check_encoding [PHP Manual]:

$validUTF8 = mb_check_encoding($string, 'UTF-8');

une Autre fonction que vous pouvez utiliser est mb_detect_encoding [PHP Manual]:

$validUTF8 = ! (false === mb_detect_encoding($string, 'UTF-8', true));

il est important de mettre le strict paramètre true.

en outre,iconv [PHP Manual] permet de changer/supprimer des séquences Invalides à la volée. (Cependant, si iconv rencontre une telle séquence, elle génère une notification; ce comportement ne peut pas être modifié.)

echo 'TRANSLIT : ', iconv("UTF-8", "ISO-8859-1//TRANSLIT", $string), PHP_EOL;
echo 'IGNORE   : ', iconv("UTF-8", "ISO-8859-1//IGNORE", $string), PHP_EOL;

Vous pouvez utiliser @ et vérifiez la longueur de la chaîne de retour:

strlen($string) === strlen(@iconv('UTF-8', 'UTF-8//IGNORE', $string));

vérifiez les exemples sur le iconv page de manuel.

vous n'avez pas partagé le code source d'où provient l'avis. Vous devez l'ajouter si vous voulez une suggestion concrète.

47
répondu hakre 2016-01-10 16:18:09

Vous pouvez essayer d'utiliser mb_detect_encoding pour détecter si vous avez un jeu de caractères différent (que UTF-8)mb_convert_encoding pour convertir en UTF-8 si nécessaire. Il est plus probable que les gens vous donnent du contenu valide dans un jeu de caractères différent que vous donnant L'UTF-8 invalide.

0
répondu Robin 2011-07-17 11:41:12

la spécification des caractères invalides dans UTF-8 est assez claire. Tu devrais les enlever avant d'essayer de les analyser. Ils ne devraient pas être là donc si vous pouviez l'éviter avant même de générer le XML ce serait encore mieux.

Voir ici pour une référence:

http://www.w3.org/TR/xml/#charsets

ce n'est pas une liste complète, de nombreux analyseur également interdire certains bas-numéroté les caractères de contrôle, mais je ne peux pas trouver un liste complète maintenant.

cependant, iconv pourrait avoir le support de builtin pour ceci:

http://www.zeitoun.net/articles/clear-invalid-utf8/start

0
répondu jishi 2011-07-17 11:47:00

mettre un @ devant iconv () pour supprimer la notification et un //ignorer après UTF-8 dans le code source ID pour ignorer les caractères invalides:

@iconv( 'UTF-8//IGNORE', $destinationEncoding, $yourString );
0
répondu nobody 2011-07-17 11:51:42