将js中的单词与非常奇怪的结果进行比较

comparing words in js with very strange result

我有一个波斯语单词,我从文本中复制了一个并在键盘上写下了另一个:

a = 'ﺧﻮاب'
"ﺧﻮاب"

b='خواب'
"خواب"

//lets compare 
a==b
false

谁能解释一下为什么? (你可以自己测试!)

找出此类差异的最简单方法是将其粘贴到文本编辑器中。

您可以看到这些字符导致了一些不同的结果:

你也可以用十六进制编辑器看一下,看看它们的十六进制代码是不一样的。您会注意到字符串的前两个字符不同。

第一个字符串是: FEA7 FEEE 0627 0628

第二个: 062E 0648 0627 0628

Free hex editor for mac.

Free hex editor for pc.

他们的前2个字母是不同的字符。

var a = 'ﺧﻮاب';
var b = 'خواب';

for ( var i = 0; i < a.length; i++ ){
    console.log(a.charCodeAt(i));
}
for ( var i = 0; i < b.length; i++ ){
    console.log(b.charCodeAt(i));
}

a is [65191, 65262, 1575, 1576]

b is [1582, 1608, 1575, 1576]

现在,如果我尝试此代码:

var a = 'ﺧﻮاب';
var b = a; // Or you can copy and paste `a` value here.
a == b; // This will return `true`

前两个字符不同,您可以在浏览器的控制台中通过 运行 a.split('') 和 b.split('') 查看差异。

每个序列的前两个字符不同:

  • a: U+FEA7 U+FEEE ...
  • b: U+062E U+0648 ...

之所以看起来一样,是因为a使用了b中字符的"presentation form"个版本,用来标记字符的加入组(例如首字母) ,中间或最终)。在这种情况下,ARABIC LETTER KHAH INITIAL FORMARABIC LETTER WAW FINAL FORM。一旦由字体渲染器(ARABIC LETTER KHAHARABIC LETTER WAW)塑造,这些将与 b 中的字符具有相同的视觉外观。

a 中的这些表示形式字符仅存在于 Unicode 中以实现向后兼容性(Unicode 现在使用不同的机制对加入组进行编码),并且在规范上等同于 b 中的字符。 a中的字符将在规范化形式C下被规范化为b中的字符。