请解释一下字符串的奇怪行为
[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返回,但仍然不明白,问题出现的原因
答案 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>
附加其他二进制字符串应该没有问题。