json_encode(): Invalid UTF-8 de la séquence d'argument
Je vais appeler json_encode()
sur des données provenant d'une base de données MySQL avec utf8_general_ci
classement. Le problème est que certaines lignes ont bizarre de données que je ne peux pas nettoyer. Par exemple le symbole de �
, donc une fois 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 ne cesse de se par et causer des ravages.
L'exécution de PHP 5.3.10 sur Mac. Donc la question est - comment puis-je nettoyer invalide utf8 symboles, en gardant le reste des données, de sorte que json_encoding()
pourrait fonctionner?
Mise à jour. Voici un moyen de le reproduire:
echo json_encode(pack("H*" ,'c32e'));
- Êtes-vous sûr que vous êtes à la récupération de vos données encodées en UTF-8 à partir de la base de données? Quelles données avez-vous, qu'attendez-vous? Nous montrer une
bin2hex
de la problématique de données. - bin2hex donne c32e
"\xC3\x2E"
est en effet pas valide chaîne UTF-8. Où est-il en venir? MySQL ne devrait pas sortie non valide des chaînes UTF-8 si c'est le retour de l'UTF-8.- Je vais avoir le même problème mais l'interrogation à partir de SQL Server via une connexion ODBC et mon caractère spécial est: ®. Il semble que personne n'a résolu ce problème.
- Avez-vous essayé le JSON_UNESCAPED_UNICODE drapeau?
Vous devez vous connecter pour publier un commentaire.
J'ai eu une erreur similaire qui a causé json_encode de retour d'un champ null lorsqu'il y avait une chaine de caractères ascii comme une apostrophe dans une chaîne de caractères, en raison du mauvais jeu de caractères étant retourné dans la requête.
La solution était de s'assurer qu'elle vient comme utf8 en ajoutant:
après la déclaration de connexion mysql.
mysqli_set_charset($con, "utf8");
avec mysqli. Merci!!!!Semble que le symbole a été
Å
, mais étant donné que les données se compose des noms qui ne devraient pas être en public, seule la première lettre a été montré et il a été fait par juste$lastname[0]
, ce qui est faux pour les chaînes de caractères multi-octets et a causé tout le tracas. Changémb_substr($lastname, 0, 1)
- fonctionne comme un charme.substr()
y ressemble votre[0]
de déréférencement 😉u
modificateur.Le problème est que ce personnage est en UTF8, mais json_encode ne le gère pas correctement.
Pour en dire plus, il y a une liste d'autres caractères (voir Liste des caractères Unicode), ce qui va déclencher la même erreur, donc de dépouiller de celui-ci (Å) ne pas corriger un problème à la fin.
Ce que nous avons utilisé est de convertir ces caractères en entités html comme ceci:
Assurez-vous que votre connexion jeu de caractères pour MySQL est UTF-8. Il est souvent par défaut est ISO-8859-1, ce qui signifie que le pilote MySQL vous permet de convertir le texte à la norme ISO-8859-1.
Vous pouvez configurer la connexion charset avec mysql_set_charset, mysqli_set_charset ou avec la requête
SET NAMES 'utf-8'
À l'aide de ce code pourrait aider. Il a résolu mon problème!
ou comme cela
Le symbole que vous avez posté est le symbole d'espace réservé pour une fracture de la séquence d'octets. Fondamentalement, ce n'est pas un symbole, mais une erreur dans votre chaîne.
Quelle est l'exacte octet valeur du symbole? Aveuglément l'application de utf8_encode n'est pas une bonne idée, il est préférable de savoir d'abord où l'octet(s) venait et ce qu'ils signifient.
Une autre chose que génère cette erreur, lorsque vous utilisez php json_encode fonction, est lors de l'unicode des caractères sont en majuscules \U et pas de minuscules \u
json_encode ne fonctionne qu'avec des données UTF-8. Vous devrez vous assurer que vos données sont en UTF-8. alternativement, vous pouvez utiliser iconv() pour convertir vos résultats à l'UTF-8 avant de nourrir json_encode()
Mise à jour.. j'ai résolu cette question en précisant que le jeu de caractères sur les AOP de connexion ci-dessous:
"mysql:host=$host;dbname=$db;charset=utf8"
Toutes les données reçues était alors dans le bon jeu de caractères pour le reste du code pour utiliser
À l'aide de la fonction setLocale('fr_FR.UTF8') avant de json_encode résolu le problème.