【发布时间】:2015-12-03 03:43:31
【问题描述】:
我有一个波斯语单词,我从文本中复制了一个,然后在键盘上写下了另一个:
a = 'ﺧﻮاب'
"ﺧﻮاب"
b='خواب'
"خواب"
//lets compare
a==b
false
谁能解释一下为什么? (你可以自己测试!)
【问题讨论】:
标签: javascript unicode comparison persian
我有一个波斯语单词,我从文本中复制了一个,然后在键盘上写下了另一个:
a = 'ﺧﻮاب'
"ﺧﻮاب"
b='خواب'
"خواب"
//lets compare
a==b
false
谁能解释一下为什么? (你可以自己测试!)
【问题讨论】:
标签: javascript unicode comparison persian
它们的前 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 是
[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`
【讨论】:
您也可以使用十六进制编辑器查看它们,看看它们有不同的十六进制代码。您会注意到字符串之间的前两个字符不同。
【讨论】:
每个序列的前两个字符不同:
a: U+FEA7 U+FEEE ...b: U+062E U+0648 ...它们看起来相同的原因是a 使用了b 中字符的“表示形式”版本,用于标记字符的加入组(例如初始、中间或最终)。在这种情况下,ARABIC LETTER KHAH INITIAL FORM 和 ARABIC LETTER WAW FINAL FORM。一旦被字体渲染器(ARABIC LETTER KHAH 和ARABIC LETTER WAW)塑造,这些将具有与b 中的字符相同的视觉外观。
a 中的这些表示形式字符仅存在于 Unicode 中以实现向后兼容性(Unicode 现在使用不同的机制对加入组进行编码),并且在规范上等同于 b 中的那些。 a 中的字符将在规范化表 C 下规范化为 b 中的字符。
【讨论】: