在使用.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
现在是我头部爆炸的部分。
要标准化字符串,您可以将NFC
,NFD
,NFKC
或NFKD
中的一个传递给.normalize()
,如下所示:
'á'.normalize('NFKC')
// "á"
当然,根据您选择的规范化形式,您可以获得不同的代码点,但无论如何。
'á'.normalize('NFC').length == 1
// true
'á'.normalize('NFD').length == 2
// true
但无论如何。关键是,将对应于规范化表单的四个字符串中的一个传递给.normalize()
,然后您将获得规范化的字符串。
由于我们知道s1
(我们从DOM检索到的字符串)和s2
是相同的字符串(s1 === s2
是true
),显然我们可以使用要么规范化字符串:
'á'.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中的一个错误。
答案 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日。