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

Toà*_*oàn 8 ruby

我有两个字符串:

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慢.