json-encode() non chaînes utf-8?

donc j'ai un tableau de chaînes, et toutes les chaînes utilisent L'encodage ANSI par défaut du système et ont été extraites d'une base de données sql. Il y a donc 256 différentes valeurs possibles de bytes de caractères (encodage d'un byte unique). Y a-t-il un moyen pour que json_encode() fonctionne et affiche ces caractères au lieu d'utiliser utf8_encode() sur toutes mes chaînes et finir avec des trucs comme "u0082"?

ou c'est la norme pour json?

22
demandé sur hakre 2011-07-07 10:30:35

8 réponses

y a-t-il un moyen pour que json_encode() fonctionne et affiche ces caractères au lieu d'utiliser utf8_encode() sur toutes mes chaînes et finir avec des trucs comme"\u0082"?

si vous avez une chaîne de caractères encodée ANSI, en utilisant utf8_encode() est la fonction erronée pour traiter ce problème. Vous devez d'abord le convertir correctement de ANSI en UTF-8. Cela va certainement réduire le nombre D'Unicode escape séquences comme \u0082 de la sortie json, mais techniquement ces séquences sont valables pour json , vous ne devez pas les craindre.

conversion ANSI en UTF-8 avec PHP

json_encode fonctionne avec UTF-8 chaînes codées seulement . Si vous devez créer valide json avec succès à partir d'une chaîne encodée ANSI , vous devez le ré-encoder / le convertir en UTF-8 d'abord. Alors json_encode fonctionnera comme indiqué.

pour convertir un encodage de ANSI (plus correctement je suppose que vous avez une chaîne de caractères codée Windows-1252 , qui est populaire mais à tort appelé ANSI ) en UTF-8 vous pouvez faire usage de la mb_convert_encoding() fonction:

$str = mb_convert_encoding($str, "UTF-8", "Windows-1252");

une autre fonction en PHP qui peut convertir le codage / jeu de caractères d'une chaîne s'appelle iconv basé sur libiconv . Vous pouvez l'utiliser aussi bien:

$str = iconv("CP1252", "UTF-8", $str);

Note sur utf8_encode ()

utf8_encode() fonctionne seulement pour Latin-1 , pas pour ANSI . Vous allez donc détruire une partie de vos caractères à l'intérieur de cette chaîne lorsque vous l'exécuterez à travers cette fonction.


Related: qu'est-Ce que Format ANSI?


pour un contrôle plus précis de ce que json_encode() retourne, voir la liste des constantes prédéfinies (version PHP dépendante, incl. PHP 5.4, certaines constantes restent non documentées et ne sont disponibles dans le code source que jusqu'à présent).

changer l'encodage d'un tableau/itérativement (commentaire AOP)

Comme vous l'avez écrit dans un commentaire que vous avez les problèmes d'appliquer la fonction sur un tableau, voici quelques exemple de code. Il est toujours nécessaire de première changer le codage avant d'utiliser json_encode . C'est juste une opération de réseau standard, pour le cas plus simple de pdo::fetch() a foreach itération:

while($row = $q->fetch(PDO::FETCH_ASSOC))
{
  foreach($row as &$value)
  {
    $value = mb_convert_encoding($value, "UTF-8", "Windows-1252");
  }
  unset($value); # safety: remove reference
  $items[] = array_map('utf8_encode', $row );
}
31
répondu hakre 2017-05-23 12:16:58

la norme JSON impose L'encodage Unicode . De RFC4627 :

3.  Encoding

   JSON text SHALL be encoded in Unicode.  The default encoding is
   UTF-8.

   Since the first two characters of a JSON text will always be ASCII
   characters [RFC0020], it is possible to determine whether an octet
   stream is UTF-8, UTF-16 (BE or LE), or UTF-32 (BE or LE) by looking
   at the pattern of nulls in the first four octets.

           00 00 00 xx  UTF-32BE
           00 xx 00 xx  UTF-16BE
           xx 00 00 00  UTF-32LE
           xx 00 xx 00  UTF-16LE
           xx xx xx xx  UTF-8

par conséquent, au sens strict, ANSI encoded JSON ne serait pas valide JSON; C'est pourquoi PHP impose l'encodage unicode lors de l'utilisation json_encode() .

quant à" default ANSI", je suis assez sûr que vos chaînes sont encodées dans Windows-1252. Il est appelés à tort ANSI.

8
répondu Andrew Moore 2011-07-07 07:26:01
<?php
$array = array('first word' => array('Слово','Кириллица'),'second word' => 'Кириллица','last word' => 'Кириллица');
echo json_encode($array);
/*
return {"first word":["\u0421\u043b\u043e\u0432\u043e","\u041a\u0438\u0440\u0438\u043b\u043b\u0438\u0446\u0430"],"second word":"\u041a\u0438\u0440\u0438\u043b\u043b\u0438\u0446\u0430","last word":"\u041a\u0438\u0440\u0438\u043b\u043b\u0438\u0446\u0430"}
*/
echo json_encode($array,256);
/*
return {"first word":["Слово","Кириллица"],"second word":"Кириллица","last word":"Кириллица"}
*/
?>

JSON_UNESCAPED_UNICODE (entier) Encoder littéralement les caractères Unicode multibytes (par défaut, c'est s'échapper sous \uXXXX). Disponible depuis PHP 5.4.0.

http://php.net/manual/en/json.constants.php#constant.json-unescaped-unicode

4
répondu Jenyok 2015-06-11 10:44:55

Oui, c'est la norme de comportement pour le json en PHP

si vous lisez la documentation: http://php.net/manual/en/function.json-encode.php

Vous verrez qu'il ne peut fonctionner qu'avec des données encodées utf-8,

d'autre part, vous pouvez utiliser le premier commentaire: http://php.net/manual/en/function.json-encode.php#104278

et créer votre propre fonction d'encodage / décodage fonctionnant avec ANSI

1
répondu Marek Sebera 2011-07-07 06:38:37

pour imprimer le mot espagnol, j'ai finalement obtenu la solution comme ci-dessous avec l'application de deux fonctions.

$conn->set_charset("utf8");

mb_convert_encoding('THE BULLOCK ÉTAGÈRE - 3 SHELVES', "UTF-8", "Windows-1252")

où 'the BULLOCK ÉTAGÈRE-3 SHELVES' cette chaîne vient de la base de données donc j'ai d'abord $ conn objet de la base de données pour définir le caractère comme utf8 puis j'ai encodé le mot espagnol UTF-8 à Windows-1252

0
répondu Bhavin Thummar 2018-05-21 10:20:59

j'ai trouvé la réponse suivante pour un problème analogue avec un tableau imbriqué Non encodé utf-8 que j'ai dû encoder json:

$inputArray = array(
    'a'=>'First item - à',
    'c'=>'Third item - é'
);
$inputArray['b']= array (
          'a'=>'First subitem - ù',
          'b'=>'Second subitem - ì'
    );
 if (!function_exists('recursive_utf8')) {
  function recursive_utf8 ($data) {
     if (!is_array($data)) {
        return utf8_encode($data);
     }
     $result = array();
     foreach ($data as $index=>$item) {
        if (is_array($item)) {
           $result[$index] = array();
           foreach($item as $key=>$value) {
              $result[$index][$key] = recursive_utf8($value);
           }
        }
        else if (is_object($item)) {
           $result[$index] = array();
           foreach(get_object_vars($item) as $key=>$value) {
              $result[$index][$key] = recursive_utf8($value);   
           }
        } 
        else {
           $result[$index] = recursive_utf8($item);
        }
     }
     return $result; 
   }
}
$outputArray =  json_encode(array_map('recursive_utf8', $inputArray ));
-1
répondu caiofior 2014-07-15 12:22:51
json_encode($str,JSON_HEX_TAG|JSON_HEX_AMP|JSON_HEX_APOS|JSON_HEX_QUOT);

qui convertira windows basé ANSI en utf-8 et l'erreur ne sera plus.

-2
répondu user3750780 2014-06-18 03:43:14

utilisez ceci à la place:

<?php 
//$return_arr = the array of data to json encode 
//$out = the output of the function 
//don't forget to escape the data before use it! 

$out = '["' . implode('","', $return_arr) . '"]'; 
?>

Copier json_encode manuel php 's commentaires. Lisez toujours les commentaires. Ils sont utiles.

-3
répondu Raptor 2011-07-07 06:35:47