56 votes

json_encode() : Séquence UTF-8 non valide dans l'argument

J'appelle json_encode() sur des données provenant d'une base de données mysql avec la collation utf8_general_ci. Le problème est que certaines lignes contiennent des données étranges que je ne peux pas nettoyer. Par exemple, le symbole donc dès qu'il atteint json_encode, il échoue avec json_encode() : Invalid UTF-8 sequence in argument. J'ai essayé utf8_encode et utf8_decode, même avec mb_check_encoding. Mais il continue à passer et à faire des ravages.

J'utilise php 5.3.10 sur Mac. Donc question - comment puis-je nettoyer les symboles utf8 invalides, en gardant le reste des données, pour que le codage json_encoding fonctionne ?

Mise à jour. Voici une façon de le reproduire :

echo json_encode(pack("H*" ,'c32e'));

33voto

Robert Imhoff Points 161

J'avais une erreur similaire qui faisait que json_encode renvoyait un champ nul chaque fois qu'il y avait un caractère hi-ascii tel qu'une apostrophe dans une chaîne, en raison du mauvais jeu de caractères renvoyé dans la requête.

La solution a été de s'assurer qu'il est fourni en utf8 en ajoutant :

mysql_set_charset('utf8');

après l'instruction de connexion mysql.

23voto

Artjom Kurapov Points 2808

On dirait que le symbole était Å mais comme les données sont constituées de noms de famille qui ne devraient pas être publics, seule la première lettre a été affichée et cela a été fait en utilisant simplement la méthode suivante $lastname[0] ce qui n'est pas correct pour les chaînes de caractères à plusieurs octets et qui est à l'origine de tous ces problèmes. Je l'ai changé en mb_substr($lastname, 0, 1) - fonctionne comme un charme.

21voto

serge.k Points 121

Le problème est que ce caractère est UTF8, mais que json_encode ne le gère pas correctement. Pour en dire plus, il existe une liste d'autres caractères (voir Liste des caractères Unicode ), qui déclenchera la même erreur, de sorte que la suppression de ce dernier (Å) ne corrigera pas un problème jusqu'au bout.

Ce que nous avons utilisé est de convertir ces caractères en entités html comme ceci :

htmlentities( (string) $value, ENT_QUOTES, 'utf-8', FALSE);

13voto

Emil Vikström Points 42251

Assurez-vous que le jeu de caractères de votre connexion à MySQL est UTF-8. La valeur par défaut est souvent ISO-8859-1, ce qui signifie que le pilote MySQL convertira le texte en ISO-8859-1.

Vous pouvez définir le jeu de caractères de connexion avec mysql_set_charset , mysqli_set_charset ou avec la requête SET NAMES 'utf-8'

3voto

Evert Points 17625

Le symbole que vous avez affiché est le symbole de remplacement pour une séquence d'octets brisée. En fait, il ne s'agit pas d'un symbole réel, mais d'une erreur dans votre chaîne.

Quelle est la valeur exacte de l'octet du symbole ? Appliquer aveuglément utf8_encode n'est pas une bonne idée, il est préférable de trouver d'abord d'où vient le ou les octets et ce qu'ils signifient.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X