web-dev-qa-db-fra.com

PHP json encode - Caractères UTF-8 mal formés, éventuellement codés de manière incorrecte

J'utilise json_encode ($ data) pour un tableau de données et un champ contient des caractères russes. J'ai utilisé mb_detect_encoding () pour afficher le codage correspondant à ce champ et le format UTF-8. Je pense que l'encodage JSON a échoué à cause de mauvais caractères comme "ра▒". J'ai essayé beaucoup de choses sur utf8_encode sur les données et cette erreur sera contournée, mais les données ne semblent plus correctes.

Que peut-on faire avec ce problème?

14
sparkmix

Le problème se produit s'il y a des caractères non-utf8 à l'intérieur même si la plupart d'entre eux sont des caractères utf8. Cela supprimera tous les caractères non-utf8 et cela fonctionne maintenant.

$data['name'] = mb_convert_encoding($data['name'], 'UTF-8', 'UTF-8');
31
sparkmix

Si vous avez un tableau multidimensionnel à encoder au format JSON, vous pouvez utiliser la fonction ci-dessous:

Si JSON_ERROR_UTF8 s'est produit:

$encoded = json_encode( utf8ize( $responseForJS ) );

La fonction ci-dessous est utilisée pour encoder les données d'un tableau de manière récursive

/* Use it for json_encode some corrupt UTF-8 chars
 * useful for = malformed utf-8 characters possibly incorrectly encoded by json_encode
 */
function utf8ize( $mixed ) {
    if (is_array($mixed)) {
        foreach ($mixed as $key => $value) {
            $mixed[$key] = utf8ize($value);
        }
    } elseif (is_string($mixed)) {
        return mb_convert_encoding($mixed, "UTF-8", "UTF-8");
    }
    return $mixed;
}
10
Irshad Khan

Assurez-vous d’initier votre objet Pdo avec le jeu de caractères iso tel qu’utf8 . Cela devrait résoudre ce problème en évitant toute danse ré-utf8izing.

$pdo = new PDO("mysql:Host=localhost;dbname=mybase;charset=utf8", 'user', 'password');
4
Tom Ah

vous venez d'ajouter dans votre connexion pdo charset = utf8  

$pdo = new PDO("mysql:Host=localhost;dbname=mybase;charset=utf8", 'user', 'password');

j'espère que ceci vous aidera

2
M.Bilal Murtaza

Supprimez les entités html avant l'encodage JSON. IS a utilisé html_entity_decode () en php et le problème a été résolu,

$json = html_entity_decode($source);
$data = json_decode($json,true);
0
jayashan perera