【发布时间】:2013-05-22 11:55:37
【问题描述】:
我遇到了一个编码问题...控制台中没有错误,但输出没有很好地编码。
我必须在字符串上使用Digest::SHA1.hexdigest,然后必须 pack 结果。
下面的例子应该输出'{´p)ODýGΗ£Iô8ü:iÀ' 但它输出'{?p)OD?GΗ?I?8?:i?'在控制台中和日志文件中的“{�p)OD�G^BΗ�I�8^D�:i�”。
所以,我的变量 pack 等于 '{?p)OD?GΗ?I?8?:i?'而不是'{´p)ODýGΗ£Iô8ü:iÀ'。这是一个大问题......我在 Rails 任务中做这件事。
有什么想法吗?
谢谢
# encoding: utf-8
require 'digest/sha1'
namespace :my_app do
namespace :check do
desc "Description"
task :weather => :environment do
hexdigest = Digest::SHA1.hexdigest('29d185d98c984a359e6e6f26a0474269partner=100043982026&code=34154&profile=large&filter=movie&striptags=synopsis%2Csynopsisshort&format=json&sed=20130527')
pack = [hexdigest].pack("H*")
puts pack # => {?p)OD?GΗ?I?8?:i?
puts '{´p)ODýGΗ£Iô8ü:iÀ' # => {´p)ODýGΗ£Iô8ü:iÀ
end
end
end
【问题讨论】:
-
你怎么知道输出应该是'{´p)ODýGΗ£Iô8ü:iÀ'。那应该是什么编码?
-
我知道是因为我在 php 中执行了相同的脚本,并在浏览器中呈现。你可以看看bit.ly/bF6nNr的第二个参数我的铁路应用程序是utf8,我的服务器也是本地人。
-
我不知道为什么你希望 pack 的结果是一个特定的 character 序列?通常对于像摘要这样的字节字符串,需要匹配特定的 byte 序列,并且需要使用明确定义的编码来发送或存储它(ASCII 中的十六进制摘要是一个简单但有空格的低效方案)。如果您确实希望将特定字符序列作为输出,然后编码为当前 Web 应用程序的输出,则在转换之前,您需要指定编码以将初始摘要字节解释为(我猜是 Latin-1)。
-
在浏览器中渲染很容易破坏它,例如,如果您转储了一些原始字节并且浏览器将它们解释为 utf8
-
注意
hexdigest和pack行可以合并:Digest::SHA1.digest( data )在 Ruby 中是等价的,而且可能稍微快一些。
标签: ruby-on-rails ruby character-encoding pack digest