J'ai un problème avec la fonction json_encode avec des caractères spéciaux.
Par exemple, j'essaie ceci:
$string="Svrček";
echo "ENCODING=".mb_detect_encoding($string); //ENCODING=UTF-8
echo "JSON=".json_encode($string); //JSON="Svr\u010dek"
Que puis-je faire pour afficher correctement la chaîne, donc JSON = "Svrček"?
Merci beaucoup.
json_encode()
ne produit pas réellement JSON * là-bas. Il génère une chaîne javascript. (Il génère JSON lorsque vous lui donnez un objet ou un tableau à coder.) C'est bien, car une chaîne javascript est ce que vous voulez.
En javascript (et en JSON), č
Peut être échappé en tant que \u010
. Les deux sont équivalents. Il n'y a donc rien de mal à ce que fait json_encode()
. Cela devrait bien fonctionner. Je serais très surpris si cela vous causait réellement des problèmes. Cependant, si le transfert s'effectue en toute sécurité dans un codage Unicode (UTF-8, généralement) †, il n'est pas nécessaire non plus. Si vous souhaitez désactiver l'échappement, vous pouvez le faire ainsi: json_encode('Svrček', JSON_UNESCAPED_UNICODE)
. Notez que l'indicateur JSON_UNESCAPED_UNICODE
A été introduit dans PHP 5.4.0, et n'est pas disponible dans les versions antérieures.
Soit dit en passant, contrairement à ce que dit @onteria_, JSON utilise UTF-8 :
Le codage des caractères du texte JSON est toujours Unicode. UTF-8 est le seul codage qui a du sens sur le fil, mais UTF-16 et UTF-32 sont également autorisés.
* Ou, au moins, il ne génère pas de JSON comme défini dans RFC 4627 . Cependant, il existe autres définitions de JSON , par lesquelles les valeurs scalaires sont autorisées .
† JSON peut être en UTF-8, UTF-16LE, UTF-16BE, UFT-32LE ou UTF-32BE.
Ok, donc, après avoir fait la connexion à la base de données dans votre script php, mettez cette ligne, et cela devrait fonctionner, au moins cela a résolu mon problème:
mysql_query('SET CHARACTER SET utf8');
Oui, json_encode
échappe les caractères non ascii. Si vous le décodez, vous obtiendrez votre résultat d'origine:
$string="こんにちは";
echo "ENCODING: " . mb_detect_encoding($string) . "\n";
$encoded = json_encode($string);
echo "ENCODED JSON: $encoded\n";
$decoded = json_decode($encoded);
echo "DECODED JSON: $decoded\n";
Production:
ENCODING: UTF-8
ENCODED JSON: "\u3053\u3093\u306b\u3061\u306f"
DECODED JSON: こんにちは
[~ # ~] éditez [~ # ~] : Ça ne vaut rien que:
JSON utilise exclusivement Unicode.
Le format d'auto-documentation qui décrit la structure et les noms de champ ainsi que des valeurs spécifiques;
Source: http://www.json.org/fatfree.html
Il utilise Unicode [~ # ~] pas [~ # ~] UTF-8. This FAQ Explique la différence entre UTF-8 et Unicode:
http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
Vous utilisez JSON, vos caractères non ascii sont échappés dans les points de code Unicode. Par exemple こ = point de code 305 .