web-dev-qa-db-fra.com

json_encode (): séquence UTF-8 non valide en argument

J'appelle json_encode() sur des données provenant d'une base de données MySQL avec le classement 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 une fois 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 cela continue de passer et de causer des ravages.

En cours d’exécution PHP 5.3.10 sur Mac. La question est donc: comment puis-je nettoyer les symboles utf8 non valides, en conservant le reste des données, pour que json_encoding() fonctionne?

Mise à jour. Voici un moyen de le reproduire:

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

On dirait que le symbole était Å, Mais comme les données sont composées de noms de famille qui ne devraient pas être publics, seule la première lettre a été montrée et elle a été créée avec seulement $lastname[0], Ce qui est faux pour les chaînes multi-octets et causé tout le tracas. Changé en mb_substr($lastname, 0, 1) - fonctionne comme un charme.

23
Artjom Kurapov

Une erreur similaire s'est produite. Json_encode a renvoyé un champ null chaque fois qu'il y avait un caractère hi-ascii tel qu'une apostrophe frisée 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 se présente sous la forme utf8 en ajoutant:

mysql_set_charset('utf8');

après l’instruction mysql connect.

33
Robert Imhoff

Le problème est que ce caractère est 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 de caractères Unicode ), qui déclenchera la même erreur, donc supprimer cette erreur (Å) ne corrigera pas le problème jusqu'à la fin.

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);
21
serge.k

Assurez-vous que votre jeu de caractères de 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'

13
Emil Vikström

L'utilisation de ce code pourrait aider. Cela a résolu mon problème!

mb_convert_encoding($post["post"],'UTF-8','UTF-8');

ou comme ça

mb_convert_encoding($string,'UTF-8','UTF-8');
6
Can Uludağ

Le symbole que vous avez posté est le symbole d'espace réservé pour une séquence d'octets cassée. En gros, ce n'est pas un vrai symbole mais une erreur dans votre chaîne.

Quelle est la valeur exacte en octets du symbole? Appliquer aveuglément utf8_encode n’est pas une bonne idée, il est préférable de savoir d’abord d’où viennent les octets et leur signification.

3
Evert

Une autre chose qui génère cette erreur, lorsque vous utilisez la fonction json_encode de php, est lorsque les caractères unicode sont en majuscule\U et non en minuscule\u

0
rharvey

json_encode fonctionne uniquement avec les données UTF-8. Vous devrez vous assurer que vos données sont en UTF-8. Vous pouvez également utiliser iconv () pour convertir vos résultats en UTF-8 avant de les transmettre à json_encode ().

0
Deepika Patel
I am very late but if some one working on SLIM to make rest api and getting same error can solve this problem by adding below line as:

<?php

// DbConnect.php file
class DbConnect
{
    //Variable to store database link
    private $con;

    //Class constructor
    function __construct()
    {

    }

    //This method will connect to the database
    function connect()
    {
        //Including the constants.php file to get the database constants
        include_once dirname(__FILE__) . '/Constants.php';

        //connecting to mysql database
        $this->con = new mysqli(DB_Host, DB_USERNAME, DB_PASSWORD, DB_NAME);

        mysqli_set_charset($this->con, "utf8"); // add this line 
        //Checking if any error occured while connecting
        if (mysqli_connect_errno()) {
            echo "Failed to connect to MySQL: " . mysqli_connect_error();
        }

        //finally returning the connection link
        return $this->con;
    }
}
0
inrsaurabh

Mise à jour .. J'ai résolu ce problème en indiquant le jeu de caractères sur la connexion PDO comme ci-dessous:

"mysql: Host = $ Host; nombase = $ db; charset = utf8"

Toutes les données reçues étaient alors dans le jeu de caractères correct pour le reste du code à utiliser

0
Jamie Deakin