2012-07-25 11 views
12

Các JSON RFC, phần 2.5, nói trong phần:Encoding JSON trong UTF-16 hay UTF-32

Để thoát khỏi một ký tự mở rộng mà không có trong Basic Multilingual Plane, nhân vật được thể hiện như một mười hai ký tự, mã hóa cặp thay thế UTF-16. Vì vậy, ví dụ, một chuỗi chỉ chứa ký tự khóa của âm nhạc G (U + 1D11E) có thể được biểu diễn là "\ uD834 \ uDD1E".

Giả sử tôi có lý do hợp lệ để mã hóa JSON dưới dạng UTF-16BE (được cho phép). Khi làm như vậy, vẫn cần thiết để thoát khỏi các ký tự không có trong Mặt phẳng đa ngôn ngữ cơ bản? Ví dụ, thay vì điều này:

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 

là 24 byte UTF-16BE byte chuỗi cho \uD834\uDD1E, là nó hợp pháp để làm điều này:

D8 34 DD 1E 

ví dụ, sử dụng UTF- 4-byte 16BE giá trị trực tiếp?

Tương tự như vậy, nếu tôi là để mã hóa chuỗi JSON giống như UTF-32BE, có thể tôi chỉ cần sử dụng giá trị mã điểm trực tiếp:

00 01 D1 1E 

?

+0

Câu hỏi hay. Tôi nghi ngờ rằng bất cứ điều gì spec nói, cuối cùng nó đi xuống đến sự hỗ trợ của bất cứ ai đang phân tích cú pháp JSON. – deceze

Trả lời

16

Theo như tôi có thể nói, có, bạn có thể ghi các giá trị UTF-16 trực tiếp. Hỗ trợ: đoạn RFC bạn trích dẫn giải thích cách thoát Unicode tùy ý nếu bạn đã quyết định thoát khỏi nó. Tuy nhiên, trước đó trong đó phần tương tự, RFC nói

Tất cả Unicode ký tự thể được đặt trong ngoặc kép dấu trừ các ký tự phải được thoát: báo giá dấu , đảo ngược dấu và các ký tự điều khiển (U + 0000 đến U + 001F).

Mọi ký tự có thể được thoát. Nếu nhân vật đang trong Basic Multilingual Plane (U + 0000 thông qua U + FFFF), sau đó nó có thể biểu diễn dưới dạng một chuỗi sáu nhân vật ...

(Nhấn mạnh thêm.)

Đối với tôi, điều này nói rằng chỉ ", \ và kiểm soát nhân vật phải được thoát, và rằng bất kỳ ký tự Unicode khác thể được đặt như nó vốn có trực tiếp vào văn bản JSON (dưới bất kỳ hình thức UTF bạn đang sử dụng). Nó cũng nói với tôi rằng ngay cả khi bạn đang mã hóa như UTF-8, bạn không cần phải sử dụng biểu mẫu \uXXXX cho bất kỳ ký tự Unicode nào khác ngoài ", \ và kiểm soát các ký tự.

(Là một sang một bên, điều này không làm cho tôi tự hỏi liệu dạng \uXXXX là thực sự hữu ích cho bất cứ điều gì khác hơn là ký tự điều khiển. Như các poster khác nói, nó có thể đi xuống đến những gì phân tích cú pháp JSON của bạn thực sự hỗ trợ.)

+3

+1. Biểu mẫu '\ u' có sử dụng nhiều hơn cho JSONP so với JSON thẳng, vì (a) bạn không thể chắc chắn' trang charset' chứa trang đang sử dụng và đặt 'bộ ký tự' trong' Nội dung kiểu 'của một'