我的印象是JavaScript解释器假设它所解释的源代码已经被标准化了。规范化到底是什么?它不能是文本编辑器,否则源的明文表示将会改变。是否存在一些"预处理器"来进行规范化?
ECMAScript 6引入了String.prototype.normalize()
,它为您处理Unicode规范化。
unorm是这个方法的JavaScript polyfill,所以你现在已经可以使用String.prototype.normalize()
了,尽管目前没有一个引擎支持它。
有关如何以及何时在JavaScript中使用Unicode规范化的更多信息,请参阅JavaScript有一个Unicode问题 - Accounting For lookalikes
不,根据ECMAScript 5, javascript没有自动使用的Unicode Normalization特性,甚至没有可用的Unicode Normalization特性。所有字符保持其原始代码点不变,可能以非normal形式。
如试题:
<script type="text/javascript">
var a= 'café'; // cafu00E9
var b= 'café'; // cafeu0301
alert(a+' '+a.length); // café 4
alert(b+' '+b.length); // café 5
alert(a==b); // false
</script>
更新: ECMAScript 6将引入JavaScript字符串的Unicode规范化。
如果你正在使用node.js
,有一个unorm
库。
我已经更新了@bobince的答案:
var cafe4= 'cafu00E9';
var cafe5= 'cafeu0301';
console.log (
cafe4+' '+cafe4.length, // café 4
cafe5+' '+cafe5.length, // café 5
cafe4 === cafe5, // false
cafe4.normalize() === cafe5.normalize() // true
);