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

时间:2015-12-03 03:43:31

标签: javascript unicode comparison persian

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

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

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

//lets compare 
a==b
false

有人可以解释我为什么吗? (你可以自己测试一下!)

5 个答案:

答案 0 :(得分:3)

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

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 [65191, 65262, 1575, 1576]

     

b [1582, 1608, 1575, 1576]

现在,如果我尝试这段代码:

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

答案 1 :(得分:2)

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

enter image description here

答案 2 :(得分:1)

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

您可以看到字符会产生不同的结果:

enter image description here

答案 3 :(得分:1)

您也可以使用十六进制编辑器查看它,看看它们有不同的十六进制代码。您会注意到字符串之间的前两个字符是不同的。

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

第二个: 062E 0648 0627 0628

Free hex editor for mac.

Free hex editor for pc.

答案 4 :(得分:1)

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

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

它们看起来相同的原因是a使用b中字符的“演示形式”版本,用于标记角色的加入组(例如,初始,中间或最后)。在这种情况下,ARABIC LETTER KHAH INITIAL FORMARABIC LETTER WAW FINAL FORM。这些视觉外观与b中由字体渲染器(ARABIC LETTER KHAHARABIC LETTER WAW)形成的字符具有相同的视觉效果。

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