我有两个字符串:
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
?
答案 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慢。