Ruby 中内置的 Base64 库添加了一些 ‘\n’。我无法找出原因。对于这个特殊的例子:
irb(main):001:0> require 'rubygems' => true irb(main):002:0> require 'base64' => true irb(main):003:0> str = "1110--ad6ca0b06e1fbeb7e6518a0418a73a6e04a67054" => "1110--ad6ca0b06e1fbeb7e6518a0418a73a6e04a67054" irb(main):004:0> Base64.encode64(str) => "MTExMC0tYWQ2Y2EwYjA2ZTFmYmViN2U2NTE4YTA0MThhNzNhNmUwNGE2NzA1\nNA==\n"
\n 位于从末尾算起的最后一个和第 6 个位置。解码器 (Base64.decode64) 完美地返回旧字符串。奇怪的是,这些 \n 不会向编码字符串添加任何值。当我从输出字符串中删除换行符时,解码器会再次完美解码。
irb(main):005:0> Base64.decode64(Base64.encode64(str).gsub("\n", '')) == str => true
更重要的是,我使用另一个 JS 库来生成相同输入字符串的 base64 编码输出,输出没有 \n。
这是一个错误还是其他什么?以前有人遇到过这个问题吗?
供参考,
$ ruby -v ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux]
编辑: 因为我写了这个答案Base64.strict_encode64()被添加,它不添加换行符。
Base64.strict_encode64()
文档有些混乱,该b64encode方法应该为每 60 个字符添加一个换行符,并且该encode64方法的示例实际上是使用该b64encode方法。
b64encode
encode64
似乎pack("m")使用的 Array 类的方法encode64也添加了换行符。我认为这是一个设计错误,这不是可选的。
pack("m")
您可以自己删除换行符,或者如果您使用的是 rails,则可以使用ActiveSupport ::CoreExtensions::Base64::Encodingencode64s方法。
encode64s