2010-04-17 3 views
2

Eh bien, le sujet dit tout. J'utilise json_encode pour convertir des données UTF8 en JSON et je dois le transférer vers une couche qui est actuellement uniquement ASCII. Donc je me demande si je dois le rendre conscient de l'UTF-8, ou puis-je le laisser tel quel. En regardant JSON rfc, UTF8 est également charset valide dans la sortie JSON, bien que non recommandé, c'est-à-dire que certaines implémentations peuvent laisser des données UTF8 à l'intérieur. La question est de savoir si l'implémentation de PHP est vidée comme ASCII ou si elle choisit de laisser quelque chose comme UTF-8.Est-ce que json_encode de PHP est garanti pour produire une chaîne ASCII?

Répondre

6

Contrairement à la prise en charge JSON dans other languages, json_encode() n'a pas la capacité de générer quoi que ce soit autre que ASCII.

+0

Merci Ignacio, c'est le genre de réponse que je cherche. Pouvez-vous fournir un site Web ou d'autres références pour le sauvegarder? –

+0

Je ne peux pas. Tout ce que je peux faire est de souligner le manque d'arguments ou d'options dans 'json_encode()' pour produire autre chose. –

+0

Je suppose que c'est suffisant. –

0

Eh bien, json_encode renvoie une chaîne. Selon le PHP documentation for string:

Une chaîne est une série de caractères. Avant PHP 6, un caractère est le même qu'un octet. Autrement dit, il y a exactement 256 caractères différents possibles. Cela implique également que PHP n'a pas de support natif d'Unicode. Voir utf8_encode() et utf8_decode() pour certaines fonctionnalités de base Unicode.

Donc, pour le moment, vous n'avez pas besoin de vous soucier de l'UTF-8. Bien sûr, vous voudrez peut-être réfléchir à tout cela, pour assurer la pérennité de votre code.

+4

Et si vous utilisez PHP 6, bon retour du futur! – salathe

+1

@salathe: Je pense que vous voulez dire "bienvenue de SVN". –

+0

Je ne peux pas utiliser utf8_encode et _decode, car PHP n'est pas de l'autre côté. J'ai besoin de transférer les données de PHP vers JSON, de les passer à travers une couche qui ne comprend que l'ASCII, et enfin de l'utiliser via JavaScript sur la destination. Sauf si JavaScript a des fonctions utf8 identiques à PHP, il n'est pas utilisable. –

3

Selon l'article JSON dans Wikipedia, les caractères Unicode dans les chaînes sont toujours

Unicode double cité avec backslash

Les exemples dans le manuel PHP sur json_encode() semblent confirmer.

Ainsi, tout doit être échappé en dehors caractère ASCII/ANSI UTF-8 comme ceci: \u0027 (note, comme @Ignacio souligne dans les commentaires, que ce soit le recommandé façon de traiter ces caractères, pas un requis un)

Cependant, je suppose que json_decode() va convertir les caractères en leurs valeurs d'octets? Vous pourriez avoir des ennuis là-bas. Si vous avez la certitude, jetez un oeil à iconv() qui pourrait convertir votre chaîne UTF-8 en ASCII (en supprimant tous les caractères non pris en charge) au préalable.

+0

Je ne veux pas laisser tomber les caractères non pris en charge. J'ai besoin de les préserver. –

+0

@Milan alors vous devriez voir à ce qu'ils restent convertis sous la forme '\ u0027'. Accrochez-vous, je vais vérifier si je peux savoir comment faire cela. –

+1

A partir de la RFC 4627, section 3, "Encodage": "Le texte JSON DOIT être codé en Unicode, l'encodage par défaut est UTF-8." Tout simplement parce que les échappements Unicode * peuvent * être utilisés ne signifie pas qu'ils sont * requis *. –

Questions connexes