Ruby Marshal.dump给出了看起来像是同一个东西

时间:2015-06-03 02:06:02

标签: ruby serialization marshalling

我看到Ruby Marshal.dump的结果略有不同,具体取决于我是否在某些内容上调用了.to_s或者输入了字符。我真的不清楚这里发生了什么:

»  Marshal.dump(1.to_s)
=> "\x04\bI\"\x061\x06:\x06EF"
»  Marshal.dump('1')
=> "\x04\bI\"\x061\x06:\x06ET"
»  1.to_s == '1'
=> true

所以虽然看起来1.to_s == '1',但它们并没有转发到同一个东西,但唯一的区别在于最后一个字节。任何想法为什么会发生这种情况以及我如何将两个东西转移到相同的字节序列?

1 个答案:

答案 0 :(得分:4)

Marshal.load("\x04\bI\"\x061\x06:\x06EF").encoding
# => #<Encoding:US-ASCII> 
Marshal.load("\x04\bI\"\x061\x06:\x06ET").encoding
# => #<Encoding:UTF-8>

默认情况下,1.to_s.encoding'1'.encoding不同。但是,这两个字符串都是7位ASCII范围,因此它们具有可比性,'1' == 1.to_s能够在一些内部魔法之后为您提供结果true。但它们不是一回事。

Marshal.dump(1.to_s.force_encoding('utf-8'))
# => "\x04\bI\"\x061\x06:\x06ET"
Marshal.dump('1')
# => "\x04\bI\"\x061\x06:\x06ET"

(假设您在较新的Ruby上运行它,并且不要混淆源编码。)