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?
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 );
}
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.
<?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
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
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
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 ));
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.
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.