2012-01-03 22 views
23

Tôi đã đọc ở một số nơi rằng chuỗi JavaScript là UTF-16 và ở những nơi khác, chúng là UCS-2. Tôi đã thực hiện một số tìm kiếm để tìm ra sự khác biệt và tìm thấy điều này:Chuỗi JavaScript - UTF-16 so với UCS-2?

Hỏi: Sự khác nhau giữa UCS-2 và UTF-16 là gì?

A: UCS-2 là thuật ngữ lỗi thời đề cập đến việc thực hiện Unicode lên đến Unicode 1.1, trước khi điểm mã thay thế và UTF-16 được thêm vào Phiên bản 2.0 của tiêu chuẩn. Thuật ngữ này giờ đây nên tránh .

UCS-2 không xác định định dạng dữ liệu riêng biệt, vì UTF-16 và UCS-2 giống hệt nhau cho mục đích trao đổi dữ liệu. Cả hai đều là 16 bit và có chính xác cùng một biểu diễn đơn vị mã.

Đôi khi trong quá khứ, triển khai đã được gắn nhãn "UCS-2" thành cho biết rằng nó không hỗ trợ các ký tự bổ sung và không diễn giải cặp điểm mã thay thế làm ký tự. Việc triển khai như vậy sẽ không xử lý việc xử lý các thuộc tính ký tự, ranh giới điểm mã, đối chiếu, v.v. cho các ký tự bổ sung.

qua: http://www.unicode.org/faq/utf_bom.html#utf16-11

Vì vậy, câu hỏi của tôi là, chẳng qua là vì phương pháp và chỉ số chuỗi của đối tượng JavaScript hành động dựa trên các giá trị dữ liệu 16-bit thay vì ký tự những gì làm cho một số người coi đó là UCS-2? Và nếu có, một đối tượng chuỗi JavaScript có định hướng xung quanh các ký tự thay vì các khối dữ liệu 16 bit được coi là UTF-16 không? Hoặc có cái gì khác tôi đang mất tích?

Edit: Theo yêu cầu, sau đây là một số nguồn tin nói rằng chuỗi Javascript là UCS-2:

http://blog.mozilla.com/nnethercote/2011/07/01/faster-javascript-parsing/ http://terenceyim.wordpress.com/tag/ucs2/

EDIT: Đối với bất cứ ai có thể đi qua này, hãy chắc chắn kiểm tra này liên kết:

http://mathiasbynens.be/notes/javascript-encoding

Trả lời

18

JavaScript, nói đúng, ECMAScript, trước ngày Unicode 2.0, vì vậy trong một số trường hợp, bạn có thể tìm thấy tham chiếu đến UCS-2 đơn giản chỉ vì đó là chính xác tại thời điểm tài liệu tham khảo được viết. Bạn có thể chỉ cho chúng tôi các trích dẫn cụ thể về JavaScript là "UCS-2" không?

Thông số kỹ thuật cho các phiên bản ECMAScript 3 và 5 ít nhất cả hai tuyên bố một cách rõ ràng một String để có một bộ sưu tập unsigned số nguyên 16-bit và rằng nếu những giá trị số nguyên có nghĩa là để đại diện cho dữ liệu văn bản, sau đó họ là UTF-16 đơn vị mã .Xem phần 8.4 của the ECMAScript Language Specification.


EDIT: Tôi không còn chắc chắn câu trả lời của tôi là hoàn toàn chính xác. Xem bài viết tuyệt vời được đề cập ở trên, http://mathiasbynens.be/notes/javascript-encoding, trong đó thực chất nói rằng trong khi một công cụ JavaScript có thể sử dụng UTF-16 nội bộ, và hầu hết, ngôn ngữ chính nó cho thấy hiệu quả các ký tự như thể chúng là UCS-2.

+0

Cảm ơn bạn đã liên kết, ngôn ngữ của thông số có vẻ khá rõ ràng. Tôi nghĩ rằng UCS-2 nói chuyện hoặc là cũ hoặc dựa trên phương pháp và hỗ trợ lập chỉ mục cho các cặp thay thế. – patorjk

+0

Vì vậy, đặc tả chỉ ra "Mỗi giá trị nguyên trong dãy thường đại diện cho một đơn vị 16-bit của văn bản UTF-16. Tuy nhiên, ECMAScript không đặt bất kỳ hạn chế hoặc yêu cầu nào về giá trị ngoại trừ chúng phải là số nguyên không dấu 16 bit ", tương đương với việc nói rằng trong các chương trình C hiện đại, mỗi giá trị ký tự trong một mảng ký tự" thường "đại diện cho một đơn vị 8-bit của văn bản UTF-8, nhưng rõ ràng nói rằng các chuỗi C" là "UTF-8 sẽ là sai rồi. JavaScript ngữ nghĩa chỉ cung cấp UCS-2; nếu bạn muốn hỗ trợ UTF-16, bạn phải tự mình làm như vậy, theo câu trả lời của DMoses. –

+0

UCS là điều có các con số và UCS 2 có lỗi thời, phiên bản hiện tại là UCS 4. UTF-8/-16/-32 là các cách biểu diễn mảng các phép toán UCS theo bit. ;) – Philip

8

Đó là UTF-16/USC-2. Nó có thể xử lý các cặp thay thế, nhưng charAt/charCodeAt trả về một char 16 bit và không phải là điểm mã Unicode. Nếu bạn muốn có nó xử lý các cặp thay thế, tôi đề nghị đọc nhanh qua this.

+0

Ý của bạn là gì bởi "nó có thể xử lý các cặp thay thế"? – cubuspl42

+0

Nếu bạn đọc bài báo được liên kết, nó sẽ mô tả cách để nó xử lý các cặp thay thế. Quan điểm của tôi là nó không bị lỗi theo mặc định, và có nhiều cách để xử lý các cặp thay thế như được hiển thị trong mã trên liên kết được cung cấp. –

+1

@ cubuspl42 UTF-16 không giới hạn 0x0-0xFFFF, nó có thể mã hóa các cặp ký tự 16 bit và biểu diễn toàn bộ phạm vi Unicode từ 0x0-0x101000, hơn một triệu điểm mã. Các cặp này được gọi là "cặp thay thế". – doug65536

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