Ruby中的编码:: CompatibilityError"<<"字符串运算符

时间:2014-12-10 16:09:32

标签: ruby string character-encoding

请解释一下字符串的奇怪行为

[22] pry(main)> s = ""
=> ""
[23] pry(main)> s << BCD.encode_to_s(99)
=> "\x99"
[24] pry(main)> s << BCD.encode_to_s(457701)
=> "\x99Ew\x01"
[30] pry(main)> "\x99" << BCD.encode_to_s(457701)
=> "\x99Ew\u0001"

所以,24和30的答案是不一样的。

BCD.encode_to_s

#arg as Numeric > 0, even digits ("3456"=good, "345"=bad)
def encode_to_s(arg)
  arg.to_s.bytes.each_slice(2).to_a.inject(""){|str, chunk| str << (chunk[0].chr+chunk[1].chr).to_i(16).chr}
end

问题在于:

[61] pry(main)> s << "\x99"
Encoding::CompatibilityError: incompatible character encodings: ASCII-8BIT and UTF-8

UPD:我解决了这个问题,将 force_encoding('UTF-8')添加到encode_to_s返回,但仍然不明白,问题出现的原因

1 个答案:

答案 0 :(得分:2)

这是一个编码问题。您的encode_to_s方法返回二进制字符串:

BCD.encode_to_s(99)          #=> "\x99"
BCD.encode_to_s(99).encoding #=> #<Encoding:ASCII-8BIT>
另一方面,Ruby的字符串文字创建了UTF-8编码的字符串:

s = ""
s.encoding #=> #<Encoding:UTF-8>

这可能不是你想要的。您可以调用String#b来创建二进制字符串:

s = "".b
s.encoding #=> #<Encoding:ASCII-8BIT>

附加其他二进制字符串应该没有问题。