2012-07-25 6 views
12

JSON RFC, sekcja 2.5, mówi w części:Kodowanie JSON w UTF-16 lub UTF-32

Aby uciec rozszerzony znak, który nie jest w podstawowe Multilingual Samolot, postać jest reprezentowana jako dwunastoznakowa sekwencja, kodująca parę surogatową UTF-16. Na przykład ciąg zawierający tylko znak G-klucz (U + 1D11E) może być reprezentowany jako "\ uD834 \ uDD1E".

Załóżmy, że mam uzasadniony powód, aby kodować JSON jako UTF-16BE (który jest dozwolony). Czy w takim razie nadal konieczne jest unikanie postaci, które nie znajdują się w podstawowej płaszczyźnie wielojęzycznej? Na przykład, zamiast tego:

00 5C 00 75 00 44 00 38 00 33 00 34 00 5C 00 75 00 44 00 44 00 31 00 45 
    \  u  D  8  3  4  \  u  D  D  1  E 

który jest 24-bajtowy UTF-16BE sekwencja bajtów dla \uD834\uDD1E, jest to legalne, aby to zrobić:

D8 34 DD 1E 

czyli użyć UTF- 4-bajtowy 16BE wartości bezpośrednio?

Podobnie, gdybym kodować ten sam ciąg JSON jako UTF-32BE, może po prostu użyć wartości kodu punkt bezpośrednio:

00 01 D1 1E 

?

+0

Dobre pytanie. Podejrzewam, że cokolwiek mówi spec, w końcu sprowadza się do wsparcia każdego, kto analizuje JSON. – deceze

Odpowiedz

16

O ile wiem, tak, można bezpośrednio zapisać wartości UTF-16. Wsparcie: cytowany przez Ciebie akapit RFC wyjaśnia, w jaki sposób uniknąć niepożądanego Unicode , jeśli zdecydowałeś się z niego uciec:. Jednak wcześniej w tej samej sekcji, RFC mówi

Wszystkie znaków Unicode może być umieszczone w notowaniu znaki wyjątkiem znaków, które muszą być ocalałem: Wyznaczona znak , reverse solidus i znaki kontrolne (U + 0000 do U + 001F).

Dowolny znak może być uniknął. Jeśli postać jest w Podstawowe wielojęzyczny Samolot (U + 0000 do U + FFFF), to może być reprezentowane jako ciąg sześciu znaków ...

(podkreślenie dodane).

Dla mnie, to mówi, że tylko ", \ i kontroli znaków must być uciekł, a wszelkie inne znaki Unicode może być umieszczone jak jest bezpośrednio do tekstu JSON (w dowolnej UTF forma używasz). Mówi mi również, że nawet jeśli kodujesz jako UTF-8, nie musisz używać formularza \uXXXX dla żadnego znaku Unicode innego niż ", \ i kontrolować znaki.

(Tak na marginesie, to czyni mnie zastanawiać, czy forma \uXXXX jest rzeczywiście przydatne do niczego innego niż znaków kontrolnych. Jako drugi plakat powiedział, że prawdopodobnie sprowadza się do tego, co się JSON parser rzeczywiście obsługuje.)

+3

+1. '\ u" formularz ma więcej funkcji dla JSONP niż prosty JSON, ponieważ (a) nie możesz być pewien, jakiego 'zestawu znaków' używa strona zawierająca i ustawiając' charset' w 'Content-Type' na'

Powiązane problemy