2011-02-04 44 views
44

Tôi có một chuỗi được tuần tự hóa thành JSON trong Javascript và sau đó được deserialized thành Java.Các ký tự JSON và ký tự thoát

Dường như chuỗi có chứa ký hiệu độ thì tôi gặp sự cố.

tôi có thể sử dụng một số giúp đỡ trong việc tìm ra ai là có lỗi:

  • là nó trở thành SpiderMonkey 1.8 thực hiện? (điều này có tích hợp triển khai JSON)
  • là nó Google gson?
  • là tôi không làm điều gì đó đúng cách?

Đây là những gì xảy ra trong JSDB:

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

tôi dự kiến ​​sẽ có "15\u00f8C' dẫn tôi để tin rằng thực hiện JSON SpiderMonkey được không làm đúng ... ngoại trừ việc JSON homepage's syntax description (là ? spec) nói rằng một char có thể

bất kỳ-Unicode-character- trừ - "- hay - \ - hay- điều khiển nhân vật"

0.123.

vì vậy có thể nó vượt qua chuỗi dọc theo nguyên trạng mà không mã hóa nó là \ u00f8 ... trong trường hợp này tôi sẽ nghĩ rằng vấn đề là với thư viện gson.

Có ai giúp được không?

Tôi cho rằng cách giải quyết của tôi là sử dụng thư viện JSON khác hoặc tự thoát chuỗi theo cách thủ công sau khi gọi JSON.stringify() - nhưng nếu đây là lỗi thì tôi muốn gửi báo cáo lỗi.

+2

Xin lỗi ... và không bao giờ quan tâm thực tế là Windows PC của tôi quyết định sử dụng bộ ký tự mà biểu tượng độ bản đồ để \ u00f8 thay vì \ u00b0! –

Trả lời

60

Đây không phải là một lỗi trong cả hai thực hiện. Không có yêu cầu để thoát U + 00B0. Để báo giá RFC:

2.5. Strings

Biểu thị chuỗi là tương tự như quy ước được sử dụng trong C nhóm ngôn ngữ lập trình. Một chuỗi bắt đầu và kết thúc bằng dấu ngoặc kép điểm. Tất cả các ký tự Unicode có thể là được đặt trong dấu ngoặc kép ngoại trừ các ký tự phải là được thoát: dấu ngoặc kép, đả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.

Thoát mọi thứ làm tăng kích thước của dữ liệu (tất cả các điểm mã có thể được biểu diễn bằng bốn byte trở xuống trong tất cả các định dạng chuyển đổi Unicode;

Có nhiều khả năng bạn có lỗi chuyển mã văn bản ở đâu đó trong mã của bạn và thoát mọi thứ trong tập hợp con ASCII sẽ che giấu vấn đề. Đây là yêu cầu của thông số JSON rằng tất cả dữ liệu sử dụng mã hóa Unicode.

+7

@user: Không có gì từ xa lười biếng trong việc hỗ trợ các ký tự không có trong bảng chữ cái cơ bản tiếng Anh. Chào mừng bạn đến năm 2015, nơi chúng tôi không sử dụng ASCII nữa. –

66

hmm, cũng đây là một workaround anyway:

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); 
     } 
    ); 
} 

kiểm tra trường hợp:

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" 
-2

này đã làm việc cho tôi:

var deg = '\u00b0C'; 
console.log(`It is -10 ${deg} outside.`); 

Màn hình in ra:

It is -10 °C outside. 
+0

Câu trả lời của bạn không liên quan gì đến JSON. –

Các vấn đề liên quan