我该如何扩展字符串类并附加一个名为to_bytes
的方法?
String#bytes
返回字符串字节的枚举器。
"asd".bytes
=> [97, 115, 100]
在Ruby 1.9.3中,#bytes
方法返回一个枚举器,所以你需要添加.to_a
将其转换为数组。从2.3版本开始或更早,您不再需要添加它。
Ruby已经有了String#each_byte
方法,它被重命名为String#bytes
。
在Ruby 1.9之前,字符串相当于字节数组,即假定字符是单个字节。这对于ASCII文本和各种文本编码(如Win-1252和ISO-8859-1)来说很好,但对于越来越多地出现在网络上的Unicode则表现不佳。Ruby 1.9+支持Unicode,并且字符串不再被认为由字节组成,而是由字符组成,可以由多个字节组成。
因此,如果您尝试将文本作为单个字节进行操作,则需要确保输入为ASCII或至少基于单字节的字符集。如果可能存在多字节字符,则应使用String#each_char
或String.split(//)
或带有U
标志的String.unpack
。
String.split(//)
中的//
是什么意思?
//
与''
相同,都表示让split
返回字符。通常也可以使用chars
。
each_byte
和bytes
方法可用,所以没有必要使用to_bytes
方法扩展String。关于Unicode字符和字节:是的,你可以轻松地将字符转换为其组成的字节,但你不能像处理单个字符那样操作它们,因为其中一些字节不是字符值,而是指示字符如何被修改的标记。任何不知道这一点并期望将文本视为字节的人,在第一次遇到Unicode时都会有一个巨大的觉醒。 - the Tin ManString.split(//)
中,//
代表什么意思? - Incerteza//
和 ''
是一样的。它们都告诉 split
返回字符。你通常也可以使用 chars
。 - the Tin Man"abcde".unpack('c*')
=> [97, 98, 99, 100, 101]
.to_a
是多余的了 ("asd".bytes.class === Array
) - Ulysse BN