2010-11-05 390 views

回答

21

红宝石已经具有String#each_byte方法,其别名为String#bytes

在Ruby 1.9之前,字符串等同于字节数组,即字符被假定为单个字节。对于ASCII文本和各种文本编码(如Win-1252ISO-8859-1),这很好,但在Unicode上出现了严重错误,我们在网络上越来越频繁地看到它。 Ruby 1.9+支持Unicode,字符串不再被认为是由字节组成,而是由多个字节组成的字符组成。

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


是什么//意味着String.split(//)

//是一样的使用''。要么告诉split返回字符。您通常也可以使用chars

+7

'“фыв”.bytes.to_a => [209,132,209,139,208,178]' - unicode字符串的字节。提问者需要字节,而不是字符。我没有看到任何问题。或者我没有看到什么? – Nakilon 2010-11-05 17:20:27

+1

是的,我说已经有'each_byte'和'bytes'方法可用,所以不需要用'to_bytes'方法扩展String。关于Unicode字符和字节:是的,您可以轻松地将字符转换为其组件字节,但不能像处理单个字符那样操作它们,因为某些字节不是字符值,而是指示如何修改字符。任何人如果不知道这一点,并且希望将文本当作字节处理,那么当他们第一次遇到Unicode时,将会有很大的觉醒。 – 2010-11-05 20:19:40

+0

'String.split(//)'中的'//'meain是什么? – 2014-11-17 11:52:10

35

String#bytes通过字符串字节返回枚举数。 .to_a可以将其转换为数组。

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

在解压的帮助下,我们可以将字符串转换为任何格式: - 字节,咬(MSB,LSB),ASCII或十六进制。请通过以下链接: - http://blog.bigbinary.com/2011/07/20/ruby-pack-unpack.html。将字符串转换为字节: -

"abcde".unpack('c*') 
=> [97, 98, 99, 100, 101]