【问题标题】:comparing words in js with very strange result比较 js 中的单词,结果很奇怪
【发布时间】:2015-12-03 03:43:31
【问题描述】:

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

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

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

//lets compare 
a==b
false

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

【问题讨论】:

    标签: javascript unicode comparison persian


    【解决方案1】:

    它们的前 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`
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        你可以看到这些字符产生了不同的结果:

        【讨论】:

        • 你的文本编辑器是什么?我尝试了所有方法,但看起来都一样
        【解决方案4】:

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

        第一个字符串是: FEA7FEEE06270628

        第二个: 062E064806270628

        Free hex editor for mac.

        Free hex editor for pc.

        【讨论】:

          【解决方案5】:

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

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

          它们看起来相同的原因是a 使用了b 中字符的“表示形式”版本,用于标记字符的加入组(例如初始、中间或最终)。在这种情况下,ARABIC LETTER KHAH INITIAL FORMARABIC LETTER WAW FINAL FORM。一旦被字体渲染器(ARABIC LETTER KHAHARABIC LETTER WAW)塑造,这些将具有与b 中的字符相同的视觉外观。

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-10-26
            • 1970-01-01
            • 2016-05-03
            • 2013-11-03
            • 1970-01-01
            相关资源
            最近更新 更多