1

这是一个奇怪的问题。我有一个混编对象(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"  
4

1 回答 1

1

正如 freenode 上 ruby​​-lang 的 rue 所指出的,irb 与脚本中的编码存在差异。

脚本中的#<Encoding:US-ASCII>
foo.encoding -> irb 中的 foo.encoding ->#<Encoding:UTF-8>

将以下魔术注释添加到脚本可解决此问题

#encoding: utf-8

于 2011-01-14T20:13:44.850 回答