【问题标题】:Encoding::CompatibilityError in Ruby "<<" string operatorRuby“<<”字符串运算符中的编码::CompatibilityError
【发布时间】:2015-02-08 22:08:14
【问题描述】:

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

[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:我解决了问题,在encode_to_s返回中添加force_encoding('UTF-8'),但还是不明白,为什么会出现问题

【问题讨论】:

  • 您的代码无法按照您发布的方式运行,请修复它。
  • 感谢您编辑您的问题,但在将整数 (99) 传递给 encode_to_s 时,我得到了 undefined method 'bytes' for 99:Fixnum
  • encode_to_s 应该做什么?
  • 这应该将整数转换为 BCD 格式。像这样:1234567890=>"\x12\x34\x56\x78\x90"
  • 顺便说一句,我认为您的代码可以简化:[arg.to_s].pack('H*')

标签: ruby string character-encoding


【解决方案1】:

这是一个编码问题。你的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>

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-29
    • 2019-07-25
    • 1970-01-01
    • 2015-08-25
    • 1970-01-01
    • 2015-05-21
    • 1970-01-01
    • 2012-07-07
    相关资源
    最近更新 更多