2012-07-10 111 views
0

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

特别是,我试图得到一个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,没有运气。

回答

1

只要做string = string.force_encoding("ASCII-8BIT")任何字符串,你想作为一个普通的老字节系列。那么你应该可以将两个字符串加在一起。

我认为.force_encoding("BINARY")也可能工作。

+0

这似乎并不很合作。我用我试图测试的实际代码修改了帖子。 – user1510597 2012-07-10 20:38:31

+0

请发布完整的堆栈跟踪。我怀疑你的错误来自于Zlib :: crc32,但我不能说。如果它来自Zlib,那么你应该问一个关于如何修复Zlib的新问题。 – 2012-07-10 20:45:44

+0

您的编辑完全改变了问题的性质。我认为这是一个关于添加两个字符串的问题,现在事实证明你正在调用一些(第三方?)库。 – 2012-07-10 20:47:01

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>