我有两个字符串:
a = 'ha? nô?i'
b = 'hà n?i'
Run Code Online (Sandbox Code Playgroud)
当我与它们进行比较时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]
Run Code Online (Sandbox Code Playgroud)
原因是什么?我怎样才能修复它以便a == b返回true?
fon*_*999 15
这是Unicode等价的问题.
为了比较这些字符串,您需要对它们进行标准化,以便它们对这些类型的字符使用相同的字节序列.
a.unicode_normalize == b.unicode_normalize
Run Code Online (Sandbox Code Playgroud)
unicode_normalize(form=:nfc) [链接]
使用Unicode标准化NFC,NFD,NFKC或NFKD返回标准化形式的str.使用的规范化形式由形式确定,形式是四个值中的任何一个: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慢.