bytes
无论字符大小如何,都返回单个字节,而codepoints
返回 unicode 代码点。
s = '日本語'
s.bytes # => [230, 151, 165, 230, 156, 172, 232, 170, 158]
s.codepoints # => [26085, 26412, 35486]
s.chars # => ["日", "本", "語"]
我明白你的困惑来自哪里。 Ruby 现在默认使用 utf-8 编码,并且 utf-8 是专门设计的,因此它的第一个代码点(0-127)是exactly与 ASCII 编码相同。 ASCII 是一种单字节字符的编码,因此在问题方法的示例中bytes
and codepoints
返回相同的值,巧合地.
因此,如果您需要将字符串分解为字符,请使用chars
or codepoints
(无论哪个适合您的用例)。使用bytes
仅当您将字符串视为不透明的二进制 blob 而不是文本时。
实际上,chars
(上面建议的)可能不够准确,因为 unicode 有组合字符和修饰字母的概念。如果你关心这个,你需要使用所谓的“字素簇”。这是一个例子(取自这个答案 https://stackoverflow.com/a/54457724/125816:
s = "a\u0308\u0303\u0323\u032d"
s.bytes # => [97, 204, 136, 204, 131, 204, 163, 204, 173]
s.codepoints # => [97, 776, 771, 803, 813]
s.chars # => ["a", "̈", "̃", "̣", "̭"]
s.grapheme_clusters # => ["ạ̭̈̃"] # rendering of this glyph is kinda broken, which illustrates the point that unicode is hard