web-dev-qa-db-fra.com

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

la fonction iconv me donne parfois une erreur:

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

Existe-t-il un moyen de détecter la présence de caractères illégaux dans la chaîne utf-8 avant de placer des données dans inconv?

19
rsk82

Tout d'abord, notez qu'il est impossible de détecter si un texte appartient à un codage non souhaité spécifique. Vous pouvez uniquement vérifier si une chaîne est valide dans un encodage donné.

Vous pouvez utiliser le contrôle de validité UTF-8 disponible dans preg_match  [Manuel PHP] depuis PHP 4.3.5. Il renverra 0 (sans information supplémentaire) si une chaîne non valide est donnée:

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

Une autre possibilité est mb_check_encoding  [Manuel PHP] :

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

Une autre fonction que vous pouvez utiliser est mb_detect_encoding  [Manuel PHP] :

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

Il est important de définir le paramètre strict sur true.

De plus, iconv  [Manuel PHP] vous permet de changer/supprimer des séquences invalides à la volée. (Toutefois, si iconv rencontre une telle séquence, une notification est générée; 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érifier la longueur de la chaîne de retour:

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

Consultez également les exemples de la page de manuel iconv

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

47
hakre

La spécification sur les caractères non valides dans UTF-8 est assez claire. Vous voulez probablement les éliminer avant d'essayer de les analyser. Ils ne devraient pas être là alors 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 analyseurs interdisent également l'utilisation de caractères de contrôle numérotés en bas, mais je ne trouve pas de liste complète pour le moment.

Cependant, iconv pourrait avoir un support intégré pour cela:

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

0
jishi

Vous pouvez essayer d'utiliser mb_detect_encoding pour détecter si vous avez un jeu de caractères différent (autre que UTF-8), puis mb_convert_encoding pour le convertir en UTF-8 si nécessaire. Il est plus probable que des personnes vous donnent un contenu valide dans un jeu de caractères différent de celui qui vous donne un UTF-8 non valide.

0
Robin

mettez un @ devant iconv () pour supprimer la NOTICE et un // IGNORE après UTF-8 dans l'ID de codage source pour ignorer les caractères non valides:

@iconv( 'UTF-8//IGNORE', $destinationEncoding, $yourString );
0
nobody