这是一个奇怪的问题。我有一个mashalled对象(cookie),一个包含2个对象的数组,这些对象已经被base64编码。我使用decode64和marshal.load解码它并使数组恢复正常。
现在我拿这个数组和marshal.dump它并将它与原始表示进行比较。 2种编码不匹配。字符串末尾的EF与第二个字母的ET。
如果我使用irb,那么它们很匹配。
相同版本的红宝石。我错过了什么?
#!/usr/bin/env ruby -v
require "base64"
require "cgi"
cookie = "BAhbB2kHSSJFNThhYmY3ZjRiOWY0OTc4NjMxOTNhNTllMzQ1YjYxNTVlMGE2NTIzZDNjZmZmZDYxNWQwNTVhNmJkMzI0ZWIxYQY6BkVU"
p Marshal.load(Base64.decode64(cookie))
p Base64.decode64(cookie)
p Marshal.dump([2, "58abf7f4b9f497863193a59e345b6155e0a6523d3cfffd615d055a6bd324eb1a"])
输出:
ruby 1.9.2p136 (2010-12-25 revision 30365) [x86_64-darwin10.5.0]
[2, "58abf7f4b9f497863193a59e345b6155e0a6523d3cfffd615d055a6bd324eb1a"]
"\x04\b[\ai\aI\"E58abf7f4b9f497863193a59e345b6155e0a6523d3cfffd615d055a6bd324eb1a\x06:\x06ET"
"\x04\b[\ai\aI\"E58abf7f4b9f497863193a59e345b6155e0a6523d3cfffd615d055a6bd324eb1a\x06:\x06EF"
irb输出:
ruby-1.9.2-p136 :001 > p Marshal.dump([2, "58abf7f4b9f497863193a59e345b6155e0a6523d3cfffd615d055a6bd324eb1a"])
"\x04\b[\ai\aI\"E58abf7f4b9f497863193a59e345b6155e0a6523d3cfffd615d055a6bd324eb1a\x06:\x06ET"
=> "\x04\b[\ai\aI\"E58abf7f4b9f497863193a59e345b6155e0a6523d3cfffd615d055a6bd324eb1a\x06:\x06ET"
答案 0 :(得分:1)
正如freenode上的ruby-lang指出的那样,irb与脚本的编码有所不同。
脚本中的 foo.encoding - &gt; #<Encoding:US-ASCII>
irb中的foo.encoding - &gt; #<Encoding:UTF-8>
向脚本添加以下魔术注释可解决问题
#encoding: utf-8