我有一个Rails项目,需要使用和操作Hex字符串。在某些阶段,我想打印我的字符串以进行故障排除和测试。但我在输出中得到了奇怪的字符串。对于以下示例,我使用的是Rails 3.1.3和ruby 1.9.3p385。
Rails控制台:
["A"].pack('H*')
=> "\xA0"
["0A"].pack('H*')
=> "\n"
["54"].pack('H*')
=> "T"
运行相同的命令,但这次使用 puts 命令输出它:
puts ["A"].pack('H*')
?
=> nil
puts ["0A"].pack('H*')
=> nil
puts ["54"].pack('H*')
"T"
=> nil
当我尝试使用 puts 命令打印结果时,对于[" A"]和[" 0A"]怎么来? t显示与运行命令相同而不打印它?为什么[" 54"]如何正常工作?
更新
上面我说puts ["0A"].pack('H*')
没有正确显示,但事实并非如此。 ["0A"].pack('H*')
返回换行字节,因此当您运行puts ["0A"].pack('H*')
时,它会以字符串格式正确显示换行字节,该字节显示为实际上是正确的。
答案 0 :(得分:4)
irb
使用inspect
方法生成要显示的字符串,["A"].pack('H*').inspect
为"\xA0"
。 puts
在其参数上调用to_s
将其转换为字符串,String#to_s
没有做任何有用的事情(除非返回self
很有用)所以:
puts ["A"].pack('H*')
正在尝试打印字节\xA0
,它不代表您的终端期望的任何编码中可打印的任何内容(这些天可能是UTF-8,但可能是ISO-8859-1或Windows-CP-1252)所以你得到标准的“我不知道这是什么”问号。 puts
可以与["0A"].pack('H*')
和["54"].pack('H*')
一起使用,因为它们可以生成可打印的字符。