ruby 中的字节与代码点

2024-01-14

ruby 字符串函数之间有什么区别:- 代码点和字节

'abcd'.bytes
=> [97, 98, 99, 100]

'abcd'.codepoints
=> [97, 98, 99, 100]

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ruby 中的字节与代码点 的相关文章

随机推荐