JSON et caractères d'échappement

J'ai une chaîne qui est sérialisée en JSON en Javascript, puis désérialisée en Java.

Il semble que si la chaîne contient un symbole de degré, alors j'ai un problème.

Je pourrais utiliser un peu d'aide pour comprendre qui blâmer:

  • est-ce L'implémentation de Spidermonkey 1.8? (cela a une implémentation JSON intégrée)
  • est-ce Google gson ?
  • est-ce moi pour ne pas faire quelque chose correctement?

Voici ce qui se passe dans JSDB:

js>s='15u00f8C'
15°C
js>JSON.stringify(s)
"15°C"

Je m'attendais à "15u00f8C' ce qui m'amène à croire que L'implémentation JSON de Spidermonkey ne fait pas la bonne chose... sauf que la description de la syntaxe de la page D'accueil JSON (est-ce la spécification?) dit qu'un char peut être

Tout caractère-Unicode- sauf- " - ou - - ou- caractère de contrôle "

Alors peut-être qu'il passe la chaîne telle quelle sans l'encoder comme u00f8... dans ce cas, je pense que le problème est avec le gson de la bibliothèque.

Quelqu'un peut-il aider?

Je suppose que ma solution de contournement consiste à utiliser une bibliothèque JSON différente, ou à échapper manuellement les chaînes moi-même après avoir appelé JSON.stringify() - mais s'il s'agit d'un bogue, je voudrais déposer un rapport de bogue.

48
demandé sur chucksmash 2011-02-04 20:39:49

2 réponses

Ce n'est pas un bug dans l'une ou l'autre implémentation. Il n'est pas nécessaire D'échapper à U+00B0. Pour citer le RFC:

2.5. Chaînes

La représentation des chaînes est similaire aux conventions utilisées dans le C la famille des langages de programmation. Un la chaîne commence et se termine par une citation marque. Tous les caractères Unicode peuvent être placé entre les guillemets sauf pour les caractères qui doivent être échappé: guillemet, inverse solidus, et les caractères de contrôle (U + 0000 à U+001F).

Tout caractère peut être échappé.

Tout échapper gonfle la taille des données (tous les points de code peuvent être représentés en quatre octets ou moins dans tous les formats de transformation Unicode; alors que les encoder tous les rend six ou douze octets).

Il est plus probable que vous ayez un bogue de transcodage de texte quelque part dans votre code et que tout ce qui s'échappe dans le sous-ensemble ASCII masque le problème. C'est un exigence de la spécification JSON que toutes les données utilisent un codage Unicode.

68
répondu McDowell 2011-02-05 19:04:51

Hmm, eh bien voici une solution de contournement, de toute façon:

function JSON_stringify(s, emit_unicode)
{
   var json = JSON.stringify(s);
   return emit_unicode ? json : json.replace(/[\u007f-\uffff]/g,
      function(c) { 
        return '\\u'+('0000'+c.charCodeAt(0).toString(16)).slice(-4);
      }
   );
}

Cas de Test:

js>s='15\u00f8C 3\u0111';
15°C 3◄
js>JSON_stringify(s, true)
"15°C 3◄"
js>JSON_stringify(s, false)
"15\u00f8C 3\u0111"
68
répondu Jason S 2011-02-04 17:48:44