相同的字符串但不同的字节代码

时间:2018-01-27 03:44:33

标签: ruby

我有两个字符串:

a = 'hà nội'
b = 'hà nội'

当我将它们与a == b进行比较时,会返回false

我检查了字节码:

a.bytes = [104, 97, 204, 128, 32, 110, 195, 180, 204, 163, 105]
b.bytes = [104, 195, 160, 32, 110, 225, 187, 153, 105]

原因是什么?如何修复它以便a == b返回true

1 个答案:

答案 0 :(得分:15)

这是Unicode equivalence的问题。

为了比较这些字符串,您需要将它们标准化,以便它们对这些类型的字符使用相同的字节序列。

a.unicode_normalize == b.unicode_normalize

unicode_normalize(form=:nfc) [link]

  

使用Unicode标准化NFC返回标准化形式的str,   NFD,NFKC或NFKD。使用的规范化形式由形式决定,   这是四个值中的任何一个:nfc,:nfd,:nfkc或:nfkd。该   默认为:nfc。

     

如果字符串不在Unicode编码中,则异常为   提高。在这种情况下,' Unicode编码'指任何UTF-8,   UTF-16BE / LE,UTF-32BE / LE,以及GB18030,UCS_2BE和   UCS_4BE。除了转换为UTF-8之外的任何其他内容都是通过转换为   UTF-8,它比UTF-8慢。