Tôi đang ở trong ấn tượng rằng trình thông dịch JavaScript giả định rằng mã nguồn mà nó đang diễn giải đã được chuẩn hóa. Gì, chính xác hóa việc bình thường hóa? Nó không thể là trình soạn thảo văn bản, nếu không thì biểu diễn thô sơ của nguồn sẽ thay đổi. Có một số "preprocessor" mà không bình thường hóa?JavaScript chuẩn hóa Unicode
Trả lời
Không, không có tính năng Unicode chuẩn hóa được sử dụng tự động trên — hoặc thậm chí có sẵn cho-JavaScript theo ECMAScript 5. Tất cả các ký tự vẫn không thay đổi như các điểm mã ban đầu của chúng, có khả năng ở dạng không bình thường.
ví dụ thử:
<script type="text/javascript">
var a= 'café'; // caf\u00E9
var b= 'café'; // cafe\u0301
alert(a+' '+a.length); // café 4
alert(b+' '+b.length); // café 5
alert(a==b); // false
</script>
Cập nhật:ECMAScript 6 will introduce Unicode normalization for JavaScript strings.
Cần chỉ ra rằng JavaScript * PREDATES * UTF-16 và thực sự hiển thị UCS-2. (Những gì nó sử dụng trong nội bộ có thể hoặc có thể không được UTF-16, nhưng nó đá UCS-2 ra.) –
Nếu bạn đang sử dụng node.js
, có một thư viện unorm
cho việc này.
Điều này làm việc trong chrome ít nhất là tốt – jontro
ECMAScript 6 giới thiệu String.prototype.normalize()
mà sẽ chăm sóc của Unicode bình thường cho bạn.
unorm là một chồng chéo JavaScript cho phương pháp này, do đó bạn đã có thể sử dụng String.prototype.normalize()
ngay hôm nay mặc dù không phải là một động cơ duy nhất hỗ trợ nó ngay tại thời điểm này.
Để biết thêm thông tin về cách thức và thời điểm sử dụng tính năng chuẩn hóa Unicode trong JavaScript, hãy xem JavaScript has a Unicode problem – Accounting for lookalikes.
Tôi đã cập nhật câu trả lời @ bobince 's:
var cafe4= 'caf\u00E9';
var cafe5= 'cafe\u0301';
console.log (
cafe4+' '+cafe4.length, // café 4
cafe5+' '+cafe5.length, // café 5
cafe4 === cafe5, // false
cafe4.normalize() === cafe5.normalize() // true
);
Động cơ trình duyệt Tôi tin là những gì xử lý nó. Đó là lý do tại sao bạn có sự khác biệt giữa các trình duyệt về những gì họ làm và không hỗ trợ. – Ryan