当字符串不是字符串时?Javascript中Unicode规范化的怪异之处
在使用Unicode规范化函数时,我遇到了Firefox中字符串行为的一些严重奇怪之处 是一个演示,在Firefox中查看控制台以查看问题 假设我有一个id为“NFKC”的按钮:当字符串不是字符串时?Javascript中Unicode规范化的怪异之处,javascript,string,firefox,unicode,unicode-normalization,Javascript,String,Firefox,Unicode,Unicode Normalization,在使用Unicode规范化函数时,我遇到了Firefox中字符串行为的一些严重奇怪之处 是一个演示,在Firefox中查看控制台以查看问题 假设我有一个id为“NFKC”的按钮: NFKC 很容易就可以得到这方面的参考: document.querySelector('#NFKC') // 现在,由于该按钮的id为NFKC,我们可以从该字符串获得如下信息: document.body.querySelector('#NFKC').id //“NFKC” 将该字符串粘贴到变量中: var
NFKC
很容易就可以得到这方面的参考:
document.querySelector('#NFKC')
//
现在,由于该按钮的id为NFKC,我们可以从该字符串获得如下信息:
document.body.querySelector('#NFKC').id
//“NFKC”
将该字符串粘贴到变量中:
var s1=document.body.querySelector('#NFKC').id
通过比较,将完全相同的字符串直接分配给变量:
var s2='NFKC'
因此,当然:
s1==s2
//真的
以及:
s1==s2
//真的
现在是我脑袋爆炸的地方
要规范化字符串,请将NFC
、NFD
、NFKC
或NFKD
中的一个传递给。normalize()
,如下所示:
标准化('NFKC')
// "á"
当然,根据您选择的规范化形式,您会得到不同的代码点,但不管怎样
'á'。标准化('NFC')。长度==1
//真的
'á'。标准化('NFD')。长度==2
//真的
但不管怎样。关键是,将与规范化表单对应的四个字符串中的一个传递给.normalize()
,您将得到一个规范化字符串
既然我们知道s1
(我们从DOM检索到的字符串)和s2
是同一个字符串(s1===s2
是true
),那么显然我们可以使用以下两种方法来规范化字符串:
“á”。规范化(s2)
"á"
//是的,因为s2是“NFKC”。
当然,s1
的行为方式也会完全相同,对吗
标准化(s1)
//RangeError:表单必须是“NFC”、“NFD”、“NFKC”或“NFKD”之一
没有
因此,问题是:当s1==s2
为真时,就.normalize()
而言,s1
似乎不等于s2
这在Chrome上没有发生,Chrome是目前为止我测试过的唯一一款浏览器
更新
这是Firefox和中的一个bug。我不确定这是否有帮助,但文档说明 这是一项实验性技术,是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日。@pat我认为这显然是不正确的行为;对于FF bug跟踪器来说,这看起来是一个非常明显的bug。我已经在我找到的位置添加了一个bug报告。看起来问题与设置了
formStr
有关。这不仅仅是DOM问题。这些也会失败:var s2='NFKC'.split('').join('')代码>和var s2='NFKCabc'。替换('abc','')代码>。但事实并非如此:vars2='N'+'F'+'K'+'C'代码>。奇怪。你能把你的更新作为答案发布并接受吗?恭喜你找到了这个bug!