2010-10-05 28 views
12

Khi tôi JSON.stringify() đoạn mã sau:Chênh lệch JSON.stringify dẫn giữa các trình duyệt

var exampleObject = { "name" : "Žiga Kovač", "kraj" : "Žužemberk"}; 

tôi nhận được kết quả khác nhau giữa các trình duyệt.

IE8 và Google Chrome trở lại:

{"name":"\u017diga Kova\u010d","kraj":"\u017du\u017eemberk"} 

Trong khi Firefox và Opera trở lại:

{"name":"Žiga Kovač","kraj":"Žužemberk"} 

Tôi đang sử dụng thực hiện JSON mẹ đẻ của trình duyệt trong tất cả 4 trình duyệt. Nếu tôi undefine thi JSON bản địa và thay thế nó bằng một từ json.org, sau đó tất cả các trình duyệt trở lại:

{"name":"Žiga Kovač","kraj":"Žužemberk"} 

Tại sao điều này xảy ra, mà kết quả là chính xác và là nó có thể làm cho rằng tất cả các trình duyệt trở lại:

{"name":"\u017diga Kova\u010d","kraj":"\u017du\u017eemberk"} 

?

+0

Liên quan: http://stackoverflow.com/questions/3550094/unicode-characters-from-json-stringify-to-real-unicode-characters –

Trả lời

12

Hai biểu diễn này là hoàn toàn tương đương.

Người dùng sử dụng trình tự thoát Unicode (\uxxxx) để đại diện cho ký tự Unicode, ký tự còn lại sử dụng ký tự Unicode thực. json.org xác định một chuỗi là:

 
string 
    - "" 
    - "chars" 
chars 
    - char 
    - char chars 
char 
    - any Unicode character except " or \ or control characters 
    - one of: \" \\ \/ \b \f \n \r \t 
    - \u four-hex-digits 

Không có sự khác biệt về chính các chuỗi, chỉ khi trình bày. Đây là điều tương tự HTML khi bạn sử dụng ©, © hoặc © để thể hiện dấu bản quyền.

+0

Làm cách nào để chuyển đổi các ký tự không phải ascii trong JSON từ Firefox và Opera sang \ uXXXX? Tôi cần chính xác điều đó. – Matic

+0

@Matic: Tôi không hiểu bạn cần gì cho điều đó? Đó là điều tương tự, sau khi tất cả.Nếu bạn gặp sự cố khi gửi dữ liệu này qua dây có '" Ž "' thay vì '" \ u017d "', bạn chỉ phải điều chỉnh tiêu đề Loại Nội dung thành UTF-8. – Tomalak

1

Tất cả đều chính xác. Một số đã trả về nó được mã hóa bằng UTF-8 và một số trong ASCII.

4

Cả hai kết quả đều chính xác, miễn là ví dụ đầu tiên của bạn được mã hóa bằng UTF-8.

ví dụ: \ u017d ist chỉ là một ký hiệu khác của Ž (017d là vị trí trong ký tự UTF8)

7

Phiên bản 'đúng' (hiển nhiên) là chuỗi UTF8 và chuỗi thoát là chuỗi ASCII có mã thoát UTF8. Mặc dù cái đầu tiên có thể được sử dụng trong một thân HTTP (miễn là mã hóa nội dung được đặt thành UTF8), cái thứ hai cũng có thể được sử dụng trong tiêu đề yêu cầu HTTP GET.

Nếu bạn muốn sử dụng phiên bản UTF8 trong yêu cầu GET, trước tiên bạn cần phải thoát khỏi nó bằng cách sử dụng encodeURIComponent.

Khi nội dung được nhận ở phía máy chủ, việc triển khai chuỗi gốc sẽ đảm bảo rằng nó chứa chính xác cùng một dữ liệu (từ tất cả các máy khách), miễn là truyền HTTP là chính xác.

Trình duyệt của bạn thường sẽ xử lý mã hóa của nó, nếu bạn gửi nó dưới dạng nội dung HTTP POST.

+1

Đó là ['encodeURIComponent'] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/encodeURIComponent) –

+0

có, điều đó ... :) –

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