【发布时间】: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