2011-10-14 18 views
11

Mam wrażenie, że interpreter JavaScript zakłada, że ​​kod źródłowy, który interpretuje, został już znormalizowany. Co dokładnie normalizuje? Nie może to być edytor tekstu, w przeciwnym razie tekstowa reprezentacja źródła będzie się zmieniać. Czy istnieje jakiś "preprocesor", który dokonuje normalizacji?Normalizacja JavaScript Unicode

+1

Silnik przeglądarka moim zdaniem jest to, co obsługuje go. Właśnie dlatego masz rozbieżności między przeglądarkami, co robią i nie obsługują. – Ryan

Odpowiedz

13

Nie, nie istnieje żadna funkcja normalizacji Unicode używana automatycznie, lub nawet dostępna dla JavaScript, jak w ECMAScript 5. Wszystkie znaki pozostają niezmienione jako oryginalne punkty kodu, potencjalnie w formie nienormalnej.

np try:

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

Aktualizacja:ECMAScript 6 will introduce Unicode normalization for JavaScript strings.

+1

Należy podkreślić, że JavaScript * PREDATE * UTF-16 i faktycznie naraża UCS-2. (To, czego używa wewnętrznie, może, ale nie musi, być UTF-16, ale wyrzuca UCS-2.) –

13

ECMAScript 6 wprowadza String.prototype.normalize() który dba o normalizacji Unicode dla Ciebie.

unorm to polyfill w języku JavaScript dla tej metody, dzięki czemu można już dziś używać String.prototype.normalize(), mimo że w danym momencie nie obsługuje go pojedynczy silnik.

Aby uzyskać więcej informacji o tym, jak i kiedy używać normalizacji Unicode w JavaScript, zobacz JavaScript has a Unicode problem – Accounting for lookalikes.

0

zaktualizowałem odpowiedź @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 
);