web-dev-qa-db-fra.com

htmlspecialchars (): Séquence multi-octets non valide en argument

Je reçois cette erreur sur mon site local.

Warning (2): htmlspecialchars(): Invalid multibyte sequence in argument in [/var/www/html/cake/basics.php, line 207]

Quelqu'un sait-il quel est le problème ou quelle devrait être la solution?

Merci.

15
gautamlakum

Assurez-vous de spécifier le codage UTF-8 si vos fichiers sont codés comme tels:

htmlspecialchars($str, ENT_COMPAT, 'UTF-8');

Le jeu de caractères par défaut pour htmlspecialchars est ISO-8859-1 (à partir de PHP v5.4, le jeu de caractères par défaut a été remplacé par "UTF-8"), ce qui pourrait expliquer pourquoi les choses se gâtent quand il rencontre des caractères multi-octets.

14
Tatu Ulmanen

J'ai rencontré cette erreur sur la production et j'ai trouvé cet article génial à ce sujet -

http://insomanic.me.uk/post/191397106/php-htmlspecialchars-htmlentities-invalid

Il semble s'agir d'un bogue dans PHP (pour CentOS du moins) qui affiche cette erreur lorsque les erreurs d'affichage sont désactivées!

5
gingerCodeNinja

Vous introduisez des données de caractère corrompues dans la fonction ou ne spécifiez pas le bon codage.

J'avais ce problème il y a quelque temps, un comportement ancien (avant PHP 5.2.7 je crois) était de renvoyer la chaîne malgré la corruption, mais depuis cette version, cette erreur sera renvoyée à la place.

Ma solution impliquait d'écrire un script pour alimenter mes chaînes avec iconv en utilisant le modificateur // IGNORE pour supprimer les données corrompues.

(Nous avions une base de données corrompue contenant certaines chaînes en UTF-8, certaines en latin-1, généralement avec des types de caractères mal définis sur les colonnes).

(En regardant le commentaire de la réponse de Tatu, je commencerais par regarder (et jouer avec) le contenu de la variable $ charset.

4
berty

Le code correct pour ne pas avoir d'erreur est:

htmlentities($string, ENT_IGNORE, 'UTF-8') ;

En plus de cela, vous pouvez également utiliser str_replace pour remplacer certains caractères incorrects, puis utiliser la fonction htmlentities.

Jetez un oeil à ce flux rss il a remplacé le plus grand signe html par gt; tag qui pourrait ne pas sembler agréable lors de la lecture de votre flux RSS. Vous pouvez remplacer ceci par quelque chose comme "-" signer ou ")" et etc.

1
Sailab Rahi

Avait le même problème parce que j'utilisais substr sur la chaîne utf-8.
L’erreur était peu fréquente et apparemment aléatoire. Une erreur s'est produite uniquement si la chaîne a été coupée sur un caractère multi-octets!

mb_substr a résolu le problème :)

1
CoR

C'est en fait l'une des erreurs les plus fréquentes que je reçois.

Parfois, je n’utilise pas la traduction __ () - un simple texte en allemand contenant äöü. Là, il est particulièrement important de se préoccuper de l’encodage des fichiers.

Veillez donc à enregistrer correctement les fichiers contenant des caractères spéciaux au format UTF8.

0
mark