2009-09-16 5 views

Répondre

22

utilisation iconv

$text = iconv("UTF-8", "UTF-8//IGNORE", $text); 

voir le manual.

Vive

+7

Cela n'a pas fonctionné pour moi. les caractères invalides sont restés. Tout comme ça n'a pas fonctionné pour bobef. ça ne fait tout simplement pas le boulot. – Rodniko

+0

Cela a fonctionné pour moi. Le fichier source a été téléchargé CSV des codes de franchise SBA, que j'ai formaté manuellement à JSON pour être utilisé dans un semoir Laravel. Mais même si mon fichier formaté a passé la validation JSON, il y avait encore des caractères UTF-8 cachés et invalides dans le fichier que PHP ne pouvait pas décoder. – Ixalmida

+0

Je n'ai pas encore débogué dans les détails mais iconv ainsi que mb_convert ne résolvent pas le problème avec json_encode() Cela peut aider dans de nombreux cas, pas dans tous. – John

1

Si vous avez rencontré l'erreur maudite « de caractère non valide » en utilisant XML de PHP ou analyseur JSON alors vous pourriez être intéressé.

Malheureusement, les analyseurs XML et JSON de PHP n'ignorent pas les caractères non-UTF8, mais ils arrêtent et lancent une erreur plutôt inutile. J'ai trouvé le formulaire de code ci-dessous net et fonctionne parfaitement pour moi ..

//reject overly long 2 byte sequences, as well as characters above U+10000 and replace with ? 
$some_string = preg_replace('/[\x00-\x08\x10\x0B\x0C\x0E-\x19\x7F]'. 
'|[\x00-\x7F][\x80-\xBF]+'. 
'|([\xC0\xC1]|[\xF0-\xFF])[\x80-\xBF]*'. 
'|[\xC2-\xDF]((?![\x80-\xBF])|[\x80-\xBF]{2,})'. 
'|[\xE0-\xEF](([\x80-\xBF](?![\x80-\xBF]))|(?![\x80-\xBF]{2})|[\x80-\xBF]{3,})/S', 
'?', $some_string); 

//reject overly long 3 byte sequences and UTF-16 surrogates and replace with ? 
$some_string = preg_replace('/\xE0[\x80-\x9F][\x80-\xBF]'. 
'|\xED[\xA0-\xBF][\x80-\xBF]/S','?', $some_string); 
+0

ne résout pas le problème avec json_encode. il signale aussi un UTF8 valide aussi invalide, malheureusement sans donner d'indice quel est le problème. – John

Questions connexes