У меня сложилось впечатление, что интерпретатор JavaScript предполагает, что интерпретируемый исходный код уже нормализован.Что именно нормализует?Это не может быть текстовый редактор, иначе текстовое представление источника изменилось бы.Есть ли какой-нибудь "препроцессор", который выполняет нормализацию?
Нет, функция нормализации Unicode не используется автоматически или даже недоступна для JavaScript в соответствии с ECMAScript 5. Все символы остаются неизменными в качестве своих исходных кодовых точек, потенциально в ненормальной форме.
например, попробуйте:
<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>
Обновление: ECMAScript 6 представит нормализацию Юникода для строк JavaScript.
ECMAScript 6 представляет String.prototype.normalize(), который позаботится о нормализации Unicode для вас.
String.prototype.normalize()
unorm - это полифилл JavaScript для этого метода, так что вы уже можете использовать String.prototype.normalize() сегодня дажехотя на данный момент ни один движок не поддерживает его изначально.
Для получения дополнительной информации о том, как и когда использовать нормализацию Unicode в JavaScript, см. В JavaScript есть проблема Unicode - Учет двойников .
Если вы используете node.js, для этого есть библиотека unorm.
node.js
unorm
https://github.com/walling/unorm
Я обновил ответ @bobince:
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 );