18 javascript string unicode firefox unicode-normalization
在使用.normalize()Unicode规范化函数时,我遇到了Firefox中字符串行为的一些严重怪异.
这是一个演示,在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中是不会发生的,这是迄今为止我测试过的唯一一款其他浏览器.
UPDATE
这是Firefox中的一个错误,已经修复.
我不确定这是否有帮助,但文档指出
这是一项实验性技术,是 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 日。
| 归档时间: | 
 | 
| 查看次数: | 1656 次 | 
| 最近记录: |