如何在Ruby中将字符串转换为字节?

28

我该如何扩展字符串类并附加一个名为to_bytes的方法?

3个回答

50

String#bytes 返回字符串字节的枚举器。

"asd".bytes
=> [97, 115, 100]

在Ruby 1.9.3中,#bytes方法返回一个枚举器,所以你需要添加.to_a将其转换为数组。从2.3版本开始或更早,您不再需要添加它。


现在 .to_a 是多余的了 ("asd".bytes.class === Array) - Ulysse BN

27

Ruby已经有了String#each_byte方法,它被重命名为String#bytes

在Ruby 1.9之前,字符串相当于字节数组,即假定字符是单个字节。这对于ASCII文本和各种文本编码(如Win-1252ISO-8859-1)来说很好,但对于越来越多地出现在网络上的Unicode则表现不佳。Ruby 1.9+支持Unicode,并且字符串不再被认为由字节组成,而是由字符组成,可以由多个字节组成。

因此,如果您尝试将文本作为单个字节进行操作,则需要确保输入为ASCII或至少基于单字节的字符集。如果可能存在多字节字符,则应使用String#each_charString.split(//)或带有U标志的String.unpack


String.split(//)中的//是什么意思?

//''相同,都表示让split返回字符。通常也可以使用chars


9
"фыв".bytes.to_a => [209, 132, 209, 139, 208, 178],意为将 Unicode 字符串“фыв”转换成字节数组,而不是字符。我认为这没有问题,还是有什么需要注意的吗? - Nakilon
1
是的,我说已经有each_bytebytes方法可用,所以没有必要使用to_bytes方法扩展String。关于Unicode字符和字节:是的,你可以轻松地将字符转换为其组成的字节,但你不能像处理单个字符那样操作它们,因为其中一些字节不是字符值,而是指示字符如何被修改的标记。任何不知道这一点并期望将文本视为字节的人,在第一次遇到Unicode时都会有一个巨大的觉醒。 - the Tin Man
String.split(//) 中,// 代表什么意思? - Incerteza
//'' 是一样的。它们都告诉 split 返回字符。你通常也可以使用 chars - the Tin Man

5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接