2011-09-23 9 views
2

J'ai rencontré un comportement intéressant dans l'implémentation native de PHP 5 de json_encode(). Apparemment, lors de la sérialisation d'un objet dans une chaîne json, le codeur annulera toutes les propriétés qui sont des chaînes contenant des guillemets "bouclés", le type qui pourrait potentiellement être copié-collé à partir de documents MS Word avec la conversion automatique activée.JSON Encode et guillemets

Est-ce un comportement normal de la part de la fonction? Que puis-je faire pour forcer ces types de personnages à se convertir en leurs équivalents de base? J'ai vérifié l'incompatibilité de l'encodage de caractères entre la base de données retournant les données et la page d'administration l'insère et tout est configuré correctement - il semble vraiment que l'encodeur refuse ces valeurs à cause de ces caractères. Est-ce que quelqu'un d'autre a rencontré ce comportement?

EDIT:

Pour clarifier; MSWord utilisera des guillemets et des apostraphes standard et les convertira en guillemets "fantaisie" ou "bouclés" plus esthétiques. Ces caractères peuvent causer des problèmes lorsqu'ils sont placés dans des gestionnaires de contenu qui ont des erreurs de charset entre leur interface d'édition (dans le HTML) et l'encodage de la base de données.

Ce n'est pas le problème ici, cependant. Par exemple, j'ai un json_object représentant le profil d'une personne et la chaîne:

Jim O’Shea

Le code UTF pour que apostraphe étant \u2019

sortira nulle dans l'objet JSON lorsque extraites de la base de données et directement json_encoded.

{"model_name":"Bio","logged":true,"BioID":"17","Name":null,"Body":"Profile stuff!","Image":"","Timestamp":"2011-09-23 11:15:24","CategoryID":"1"}

+2

Pouvez-vous montrer un exemple concret? –

+0

Je ne suis pas sûr de ce que vous entendez par "annuler les propriétés qui sont des chaînes contenant des accolades". Cependant, j'ai testé 'json_decode()' la chaîne ''{" {a} ":" {b, c, d} "}'' et cela a fonctionné comme prévu. –

+0

@Jack bouclés ** devis, ** pas d'accolades. –

Répondre

4

Jamais eu ce problème spécifique (par exemple avec json_encode()) mais une solution simple - quoique un peu moche - que j'ai utilisée dans d'autres endroits est de faire défiler vos données et de le passer grâce à cette fonction que je suis arrivé de quelque part (le créditera quand je trouve où je l'ai eu):

function convert_fancy_quotes ($str) { 
    return str_replace(array(chr(145),chr(146),chr(147),chr(148),chr(151)),array("'","'",'"','"','-'),$str); 
} 
1

Si je dois le faire, je suis copier le texte dans le Bloc-notes et copiez-le à partir de là. Le bloc-notes l'oblige à être des guillemets normaux. N'a jamais eu à le faire par le code si ...

2

json_encode a la mauvaise habitude de cordes tombant silencieusement qu'il trouve des caractères non valides (non-UTF8) dans. (Voir ici pour le fond: How to keep json_encode() from dropping strings with invalid characters)

Ma conjecture est les citations frisées sont dans le mauvais jeu de caractères, ou se convertir en cours de route. Par exemple, il se peut que votre connexion à la base de données soit codée ISO-8859-1.

Pouvez-vous préciser d'où proviennent les données dans quel format?