18 javascript string unicode firefox unicode-normalization
在使用.normalize()Unicode规范化函数时,我遇到了Firefox中字符串行为的一些严重怪异.
这是一个演示,在Firefox中查看控制台以查看问题.
假设我有一个id为"NFKC"的按钮:
<button id="NFKC">NFKC</button>
Run Code Online (Sandbox Code Playgroud)
得到一个参考,很容易:
document.querySelector('#NFKC')
// <button id="NFKC">
Run Code Online (Sandbox Code Playgroud)
现在,由于此按钮的id为NFKC,我们可以按如下方式获取该字符串:
document.body.querySelector('#NFKC').id
// "NFKC"
Run Code Online (Sandbox Code Playgroud)
将该字符串粘贴在变量中:
var s1 = document.body.querySelector('#NFKC').id
Run Code Online (Sandbox Code Playgroud)
通过比较,直接将相同的字符串分配给变量:
var s2 = 'NFKC'
Run Code Online (Sandbox Code Playgroud)
所以当然:
s1 === s2
// true
Run Code Online (Sandbox Code Playgroud)
和:
s1 == s2
// true
Run Code Online (Sandbox Code Playgroud)
现在是我头部爆炸的部分.
要标准化字符串,您传递的一个NFC,NFD,NFKC,或NFKD至.normalize(),就像这样:
'á'.normalize('NFKC')
// "á"
Run Code Online (Sandbox Code Playgroud)
当然,根据您选择的规范化形式,您可以获得不同的代码点,但无论如何.
'á'.normalize('NFC').length == 1
// true
'á'.normalize('NFD').length == 2
// true
Run Code Online (Sandbox Code Playgroud)
但是无所谓.关键是,将对应于规范化形式的四个字符串中的一个传递给.normalize(),然后你将得到一个规范化的字符串.
既然我们知道s1(我们从DOM中检索到的字符串)并且s2是相同的字符串(s1 === s2是true),那么显然我们可以使用它们来规范化字符串:
'á'.normalize(s2)
"á"
// well yeah, because s2 IS 'NFKC'.
Run Code Online (Sandbox Code Playgroud)
当然,s1表现方式完全相同,对吧?
'á'.normalize(s1)
// RangeError: form must be one of 'NFC', 'NFD', 'NFKC', or 'NFKD'
Run Code Online (Sandbox Code Playgroud)
不.
所以,问题是:为什么它似乎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
Run Code Online (Sandbox Code Playgroud)
然而,此页面的最后更新时间是 2014 年 11 月 18 日。
| 归档时间: |
|
| 查看次数: |
1656 次 |
| 最近记录: |