当字符串不是字符串? Javascript中的Unicode规范化怪异

时间:2015-03-19 19:39:58

标签: javascript string firefox unicode unicode-normalization

在使用.normalize() Unicode规范化函数时,我遇到了Firefox中字符串行为的一些严重怪异。

Here是一个演示,在Firefox中查看控制台以查看问题。

假设我有一个id为" NFKC":

的按钮
<button id="NFKC">NFKC</button>

获得对此的参考,很简单:

document.querySelector('#NFKC')
// <button id="NFKC">

现在,由于此按钮的ID为NFKC,我们可以按如下方式获取该字符串:

document.body.querySelector('#NFKC').id
// "NFKC"

将该字符串粘贴在变量中:

var s1 = document.body.querySelector('#NFKC').id

通过比较,直接将相同的字符串分配给变量:

var s2 = 'NFKC'

当然:

s1 === s2
// true

s1 == s2
// true

现在是我头部爆炸的部分。

要标准化字符串,您可以将NFCNFDNFKCNFKD中的一个传递给.normalize(),如下所示:

'á'.normalize('NFKC')
// "á"

当然,根据您选择的规范化形式,您可以获得不同的代码点,但无论如何。

'á'.normalize('NFC').length == 1
// true
'á'.normalize('NFD').length == 2
// true

但无论如何。关键是,将对应于规范化表单的四个字符串中的一个传递给.normalize(),然后您将获得规范化的字符串。

由于我们知道s1(我们从DOM检索到的字符串)和s2是相同的字符串(s1 === s2true),显然我们可以使用要么规范化字符串:

'á'.normalize(s2)
"á"
// well yeah, because s2 IS 'NFKC'. 

当然,s1的行为方式完全一样,对吧?

'á'.normalize(s1)
 // RangeError: form must be one of 'NFC', 'NFD', 'NFKC', or 'NFKD'

不。

所以问题是:为什么当s1为真时,s2.normalize()不等s1 === s2

这在Chrome中是不会发生的,这是迄今为止我测试过的唯一一款其他浏览器。

更新

这是Firefox和has been fixed中的一个错误。

1 个答案:

答案 0 :(得分:1)

我不确定这是否会有所帮助,但文档说明了

  

这是一项实验技术,是Harmony(ECMAScript 6)提案的一部分。   由于此技术规范尚未稳定,请检查兼容性表以了解各种浏览器的用法。另请注意,随着规范的更改,实验技术的语法和行为可能会在未来版本的浏览器中发生变化。

兼容性表是

Feature         Chrome  Firefox (Gecko) Internet Explorer           Opera   Safari
Basic support   34      31 (31)         11 on Windows 10 Preview    (Yes)   Not supported

但是,此页面的最新更新时间是2014年11月18日。