This question already has answers here:
p vs puts in Ruby
(6个答案)
上个月关门了。
有人能解释一下,为什么有两种不同的输出?
IRB(交互式ruby shell)中的代码:
irb(main):001:0> require 'base64'
=> true
irb(main):002:0> cookie = "YXNkZmctLTBEAiAvi95NGgcgk1W0pyUKXFEo6IuEvdxhmrfLqNVpskDv5AIgVn8wfIWf0y41cb%2Bx9I0ah%2F4BIIeRJ54nX2qGcxw567Y%3D"
=> "YXNkZmctLTBEAiAvi95NGgcgk1W0pyUKXFEo6IuEvdxhmrfLqNVpskDv5AIgVn8wfIWf0y41cb%2Bx9I0ah%2F4BIIeRJ54nX2qGcxw567Y%3D"
irb(main):003:0> decoded_cookie = Base64.urlsafe_decode64(URI.decode(cookie))
=> "asdfg--0D\x02 /\x8B\xDEM\x1A\a \x93U\xB4\xA7%\n\\Q(\xE8\x8B\x84\xBD\xDCa\x9A\xB7\xCB\xA8\xD5i\xB2@\xEF\xE4\x02 V\x7F0|\x85\x9F\xD3.5q\xBF\xB1\xF4\x8D\x1A\x87\xFE\x01 \x87\x91'\x9E'_j\x86s\x1C9\xEB\xB6"

Linux终端代码:
asd@asd:~# ruby script.rb
asdfg--0D /��M� �U��%
\Q(苄��a��˨�i�@�� V0|���.5q������ ��'�'_j�s9�

脚本:
require 'base64'
require 'ecdsa'
cookie = "YXNkZmctLTBEAiAvi95NGgcgk1W0pyUKXFEo6IuEvdxhmrfLqNVpskDv5AIgVn8wfIWf0y41cb%2Bx9I0ah%2F4BIIeRJ54nX2qGcxw567Y%3D"

def decode_cookie(cookie)
  decoded_cookie = Base64.urlsafe_decode64(URI.decode(cookie))
end

puts (decode_cookie(cookie))

如何在终端获得相同的输出?
我需要输出:
“asdfg--0D\x02/\x8B\xDEM\x1A\x93U\xB4\xB4\xB4\xB8\x8B\x84\xB4\xBCA\x9A\xB7\xB7\xB7\xB8\xD5i\xB2@\xE4\x04\x02 V\x7F0;\x85\x9F\xD3.5q\xB1\xB4\x8D\x1A\x87\xX07\x87\x07\x07\x07\x07\x07\x07\x07\x07\x07\x02\x02\x02\x02\x02\x02\x02\x02\x02\x02\x1C9\xEB\xB6英寸
在Linux终端中。

最佳答案

"\x8B"这样的字符串是字符的表示,而不是文本\x8B。如果Ruby缺少显示字符的字体,或者它弄乱了空格(例如"\n"是一个换行符,而不是\后跟一个n),那么它就使用这种表示法。
在irb中获得另一个输出的原因是您没有使用puts打印字符串(就像在脚本中一样)。简单地调用decoded_cookie将返回字符串表示,而不是实际内容。
您只需将实际内容打印到输出即可显示。

require 'base64'

cookie = "YXNkZmctLTBEAiAvi95NGgcgk1W0pyUKXFEo6IuEvdxhmrfLqNVpskDv5AIgVn8wfIWf0y41cb%2Bx9I0ah%2F4BIIeRJ54nX2qGcxw567Y%3D"
decoded_cookie = Base64.urlsafe_decode64(URI.decode(cookie))
puts decoded_cookie
# asdfg--0D /��M �U��%
# \Q(苄��a��˨�i�@�� V0|���.5q����� ��'�'_j�s9�
#=> nil

您可以找到有关"\xnn"表示here的更多信息。
如果希望脚本显示字符串表示形式,请使用p而不是puts,或者使用puts decoded_cookie.inspect

09-04 08:15