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
Odpowiedz
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.
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.) –
Jeśli używasz node.js
, istnieje unorm
biblioteka dla tego produktu.
To działa w chromie przynajmniej tak samo – jontro
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.
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
);
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