JSON ne devrait pas.stringify échapper aux caractères Unicode?

j'ai un test simple page en UTF-8 dans lequel le texte avec des lettres dans plusieurs langues différentes obtient stringified en JSON:

http://jsfiddle.net/Mhgy5/

HTML:

<textarea id="txt">
検索 • Busca • Sök • 搜尋 • Tìm kiếm • Пошук • Cerca • Søk • Haku • Hledání • Keresés • 찾기 • Cari • Ara • جستجو • Căutare • بحث • Hľadať • Søg • Serĉu • Претрага • Paieška • Poišči • Cari • חיפוש • Търсене • Іздеу • Bilatu • Suk • Bilnga • Traži • खोजें
</textarea>
<button id="encode">Encode</button>
<pre id="out">
</pre>

JavaScript:

​$("#encode").click(function () {
    $("#out").text(JSON.stringify({ txt: $("#txt").val() }));
}).click();
​

alors que je m'attends à ce que les caractères non-ASCII soient échappés comme uXXXX selon le JSON spec, ils semblent intacts. Voici la sortie que j'obtiens du test ci-dessus:

{"txt":"検索 • Busca • Sök • 搜尋 • Tìm kiếm • Пошук • Cerca • Søk • Haku • Hledání • Keresés • 찾기 • Cari • Ara • جستجو • Căutare • بحث • Hľadať • Søg • Serĉu • Претрага • Paieška • Poišči • Cari • חיפוש • Търсене • Іздеу • Bilatu • Suk • Bilnga • Traži • खोजेंn"}

je suis en utilisant google Chrome, il devrait donc être le natif JSON.stringify mise en œuvre. L'encodage de la page est UTF-8. Les personnages non-ASCII ne devraient-ils pas être évadés?

Ce qui m'a amené à ce test, en premier lieu, j'ai remarqué que jQuery.ajax ne semble pas échapper aux caractères non-ASCII lorsqu'ils apparaissent dans une propriété d'objet de données. Les caractères semblent être transmis comme UTF-8.

10
demandé sur athspk 2012-09-05 01:23:06

4 réponses

JSON spec n'exige pas la conversion des caractères unicode en séquences escape. "N'importe quel caractère UNICODE sauf" ou \ ou le caractère de contrôle."est défini à un JSON valide-chaîne sérialisée:

json string format

30
répondu Rob W 2012-09-04 21:32:32

la réponse courte à votre question est non; JSON.stringify ne devrait pas échapper à votre chaîne.

bien que, la manipulation utf8 les chaînes de caractères peuvent sembler étranges si vous enregistrez votre fichier HTML avec utf-8 encodage mais ne pas déclarer un utf8 fichier.

Par exemple:

<!doctype html>
<html>
    <head>
        <title></title>
        <script>
            var data="árvíztűrő tükörfúrógép ÁRVÍZTŰRŐ TÜKÖRFÚRÓGÉP";
            alert(JSON.stringify(data));
        </script>
    </head>
</html>

Ce serait alerte "árvíztűrÅ‘ tükörfúrógép ÃRVÃZTÅ°RÅ TÃœKÖRFÚRÓGÉP".

Mais si vous ajoutez la ligne suivante dans l'en-tête:

<meta charset="UTF-8">

alors, l'alerte être ce que l'on pourrait attendre: "árvíztűrő tükörfúrógép ÁRVÍZTŰRŐ TÜKÖRFÚRÓGÉP".

5
répondu Csongor Halmai 2017-01-19 17:00:55

Non. Le codage préféré pour JSON est UTF-8, de sorte que ces caractères n'ont pas besoin d'être échappés.

vous êtes autorisé à échapper aux caractères unicode si vous voulez être plus sûr ou envoyer explicitement le JSON dans un encodage différent (c'est-à-dire, ASCII pur), mais c'est contre les recommandations.

3
répondu GolezTrol 2012-09-04 21:26:11

votre demande n'est tout simplement pas vraie. Les chaînes JSON sont composées de codépoints unicode (sauf '"' et '\'), c'est tout. Le document JSON entier peut être encodé en UTF-8, UTF-16 ou UTF-32, à la discrétion du producteur. de plus, les chaînes peuvent contenir des séquences d'échappement qui fournissent un autres forme de nommage des points de code, alternative à leur inclusion littérale.

Si la distinction entre les deux échappe encore vous, voici un exemple de deux différentes façons d'écrire la même chaîne dans JSON:

  • "A"

  • "\u0041"

les deux versions représentent la même chaîne, qui consiste en un seul point U + 41, qui est A.

1
répondu Kerrek SB 2012-09-04 21:29:11