我看到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'
,但它们并没有转发到同一个东西,但唯一的区别在于最后一个字节。任何想法为什么会发生这种情况以及我如何将两个东西转移到相同的字节序列?
答案 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上运行它,并且不要混淆源编码。)