使用Ruby 1.9 String作为字节流,而不是编码字符串

时间:2012-07-10 20:25:18

标签: ruby string

是否可以在字符串上获取旧的Ruby 1.8行为,并将其作为字节流而不是编码字符串使用?

特别是,我试图将一些字节与Unicode编码的字符串结合起来,所以:

\xFF\x00\x01#{Unicode encoded string}

但是,如果我尝试这样做,它也会尝试编码\ xFF \ x00 \ x01,这将无效。

代码

我正在尝试用irb做什么:

"#{[4278190080].pack("V").force_encoding("BINARY")}\xFF".force_encoding("BINARY")

这给了我:

Encoding::CompatibilityError: incompatible character encodings: ASCII-8BIT and UTF-8
        from (irb):41
        from /usr/bin/irb:12:in `<main>'

我也尝试过使用ASCII-8BIT而没有运气。

2 个答案:

答案 0 :(得分:1)

只需将string = string.force_encoding("ASCII-8BIT")添加到您想要视为普通旧字节系列的任何字符串。然后你应该能够将两个字符串加在一起。

我认为.force_encoding("BINARY")也可能有用。

答案 1 :(得分:0)

默认情况下,您插入的字符串文字为UTF-8。我认为Encoding::CompatibilityError是由在UTF-8字符串中插入BINARY编码的字符串引起的。

尝试使用兼容编码连接字符串,例如:

irb> s = [4278190080].pack("V") + "\xFF".force_encoding("BINARY")
=> "\x00\x00\x00\xFF\xFF"
irb>> s.encoding
=> #<Encoding:ASCII-8BIT>
irb> s=[4278190080].pack("V") + [0xFF].pack("C")
=> "\x00\x00\x00\xFF\xFF"
irb> s.encoding
=> #<Encoding:ASCII-8BIT>