2013-03-03 25 views
17

sau dường như không đúngJavascript "" .charCodeAt (0) bị kẹt tại 55357?

"".charCodeAt(0); // returns 55357 in both Firefox and Chrome 

đó là một ký tự Unicode tên ROCKET (U + 1F680), những thập phân phải 128640.

này là dành cho một am viết ứng dụng unicode. Dường như hầu hết nhưng không phải tất cả các ký tự từ unicode 6 đều bị kẹt ở 55357.

làm cách nào để khắc phục? Cảm ơn.

+5

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/charCodeAt –

+0

câu trả lời hay nhất. thx @JoshLee –

+0

@XahLee, đó là một bình luận, không phải là câu trả lời. Vui lòng đánh dấu * câu trả lời * tốt nhất khi được chấp nhận. –

Trả lời

9

JavaScript được sử dụng UTF-16 mã hóa; xem this article để biết chi tiết:

Ký tự bên ngoài BMP, ví dụ: U + 1D306 tetragram cho center(), chỉ có thể được mã hóa theo UTF-16 sử dụng hai đơn vị mã 16 bit: 0xD834 0xDF06. Đây được gọi là cặp thay thế. Lưu ý rằng cặp thay thế chỉ thể hiện một ký tự đơn.

Đơn vị mã đầu tiên của cặp thay thế luôn nằm trong khoảng từ 0xD800 đến 0xDBFF và được gọi là đại diện thay thế hoặc đại diện chính.

Đơn vị mã thứ hai của cặp thay thế luôn nằm trong khoảng từ 0xDC00 đến 0xDFFF và được gọi là đại diện thay thế thấp hoặc thay thế đường nhỏ.

Bạn có thể giải mã các cặp thay thế như thế này:

codePoint = (text.charCodeAt(0) - 0xD800) * 0x400 + text.charCodeAt(1) - 0xDC00 + 0x10000 

mã hoàn chỉnh có thể được tìm thấy có thể được tìm thấy trong Mozilla documentation for charCodeAt.

+0

tất cả các câu trả lời tuyệt vời. Liên kết của Josh Lee tới https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/charCodeAt, chứa mã để khắc phục sự cố. –

+0

Daniel, bạn có cân nhắc việc thêm liên kết Mozilla đó không? vì nó chứa mã hoạt động. cảm ơn. –

0

Tôi nghĩ rằng đó là vì họ đang trả lại mã đơn vị mã UTF-16 đầu tiên của ký tự đó. Tôi không chắc bạn có thể làm được gì nhiều, bởi vì họ trả về giá trị 16 bit - tôi có thể thử giải mã thủ công ký tự từ hai đơn vị mã đầu tiên và sau đó mã hóa nó trong UTF-32, có vẻ như bạn muốn gì.

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