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?
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.
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:
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.
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 );