显示ruby命令的输出.pack(" H *")

时间:2015-01-07 03:17:46

标签: ruby-on-rails ruby string hex pack

我有一个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*')时,它会以字符串格式正确显示换行字节,该字节显示为实际上是正确的。

1 个答案:

答案 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*')一起使用,因为它们可以生成可打印的字符。