JavaScript Unicode 规范化

Posted

技术标签:

【中文标题】JavaScript Unicode 规范化【英文标题】:JavaScript Unicode normalization 【发布时间】:2011-12-08 00:33:48 【问题描述】:

我的印象是 javascript 解释器假定它正在解释的源代码已经被规范化。什么,归一化到底是什么?它不能是文本编辑器,否则源的明文表示会改变。是否有一些“预处理器”进行规范化?

【问题讨论】:

我相信是浏览器引擎处理它。这就是为什么浏览器在支持和不支持的方面存在差异的原因。 【参考方案1】:

我已经更新了@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
);

【讨论】:

【参考方案2】:

不,根据 ECMAScript 5,JavaScript 上没有自动使用或什至可用的 Unicode 规范化功能。所有字符作为其原始代码点保持不变,可能采用非规范形式。

例如尝试:

<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 will introduce Unicode normalization for JavaScript strings.

【讨论】:

需要指出的是,JavaScript PREDATES UTF-16 实际上暴露了 UCS-2。 (它在内部使用的可能是也可能不是 UTF-16,但它会将 UCS-2 踢出。)【参考方案3】:

ECMAScript 6 引入了 String.prototype.normalize(),它会为您处理 Unicode 规范化。

unorm 是此方法的 JavaScript 填充程序,因此即使目前没有一个引擎原生支持它,您今天也可以使用 String.prototype.normalize()

有关如何以及何时在 JavaScript 中使用 Unicode 规范化的更多信息,请参阅JavaScript has a Unicode problem – Accounting for lookalikes。

【讨论】:

【参考方案4】:

如果您使用的是 node.js,则有一个 unorm 库用于此。

https://github.com/walling/unorm

【讨论】:

以上是关于JavaScript Unicode 规范化的主要内容,如果未能解决你的问题,请参考以下文章

Windows 中的 Unicode 规范化

JavaScript

规范化 Unicode

File.listFiles() 使用 JDK 6 破坏 unicode 名称(Unicode 规范化问题)

JavaScript的词法结构精华篇

如何在 Java 中规范化 Unicode 数字