Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当字符串不是字符串时?Javascript中Unicode规范化的怪异之处_Javascript_String_Firefox_Unicode_Unicode Normalization - Fatal编程技术网

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

当字符串不是字符串时?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

在使用Unicode规范化函数时,我遇到了Firefox中字符串行为的一些严重奇怪之处

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

假设我有一个id为“NFKC”的按钮:

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!