【问题标题】:Problems with character encoding in ResqueResque 中的字符编码问题
【发布时间】:2012-09-19 04:48:20
【问题描述】:

我有一系列 JSON 消息需要处理,但在字符编码方面遇到了一些问题。我从 RabbitMQ 队列中检索此消息,如下所示:

@data = []
@queue.pop do |metadata, payload|
  parsed_message = JSON.parse(payload)
  @data << parsed_message
end

然后我使用 Resque 处理它们并将它们排入队列,如下所示:

Resque.enqueue(Worker, @data)

当我运行 worker 时,它会抛出这个错误:

** [16:06:13 2012-09-14] 5375: Error reserving job: #<Encoding::InvalidByteSequenceError: "\xC3" on US-ASCII>
** [16:06:13 2012-09-14] 5375: /usr/local/lib/ruby/1.9.1/json/common.rb:148:in `encode'
/usr/local/lib/ruby/1.9.1/json/common.rb:148:in `initialize'
/usr/local/lib/ruby/1.9.1/json/common.rb:148:in `new'
/usr/local/lib/ruby/1.9.1/json/common.rb:148:in `parse'
/usr/local/lib/ruby/gems/1.9.1/gems/multi_json-1.3.6/lib/multi_json/adapters/json_common.rb:7:in `load'
/usr/local/lib/ruby/gems/1.9.1/gems/multi_json-1.3.6/lib/multi_json.rb:93:in `load'
/usr/local/lib/ruby/gems/1.9.1/gems/resque-1.22.0/lib/resque/helpers.rb:38:in `decode'
/usr/local/lib/ruby/gems/1.9.1/gems/resque-1.22.0/lib/resque.rb:149:in `pop'
/usr/local/lib/ruby/gems/1.9.1/gems/resque-1.22.0/lib/resque/job.rb:100:in `reserve'
/usr/local/lib/ruby/gems/1.9.1/gems/resque-1.22.0/lib/resque.rb:303:in `reserve'
/usr/local/lib/ruby/gems/1.9.1/gems/resque-1.22.0/lib/resque/worker.rb:209:in `block in reserve'
/usr/local/lib/ruby/gems/1.9.1/gems/resque-1.22.0/lib/resque/worker.rb:207:in `each'
/usr/local/lib/ruby/gems/1.9.1/gems/resque-1.22.0/lib/resque/worker.rb:207:in `reserve'
/usr/local/lib/ruby/gems/1.9.1/gems/resque-1.22.0/lib/resque/worker.rb:136:in `block in work'
/usr/local/lib/ruby/gems/1.9.1/gems/resque-1.22.0/lib/resque/worker.rb:133:in `loop'
/usr/local/lib/ruby/gems/1.9.1/gems/resque-1.22.0/lib/resque/worker.rb:133:in `work'
/usr/local/lib/ruby/gems/1.9.1/gems/resque-1.22.0/lib/resque/tasks.rb:36:in `block (2 levels) in <top (required)>'
/usr/local/lib/ruby/1.9.1/rake/task.rb:205:in `call'
/usr/local/lib/ruby/1.9.1/rake/task.rb:205:in `block in execute'
/usr/local/lib/ruby/1.9.1/rake/task.rb:200:in `each'
/usr/local/lib/ruby/1.9.1/rake/task.rb:200:in `execute'
/usr/local/lib/ruby/1.9.1/rake/task.rb:158:in `block in invoke_with_call_chain'
/usr/local/lib/ruby/1.9.1/monitor.rb:211:in `mon_synchronize'
/usr/local/lib/ruby/1.9.1/rake/task.rb:151:in `invoke_with_call_chain'
/usr/local/lib/ruby/1.9.1/rake/task.rb:144:in `invoke'
/usr/local/lib/ruby/1.9.1/rake/application.rb:116:in `invoke_task'
/usr/local/lib/ruby/1.9.1/rake/application.rb:94:in `block (2 levels) in top_level'
/usr/local/lib/ruby/1.9.1/rake/application.rb:94:in `each'
/usr/local/lib/ruby/1.9.1/rake/application.rb:94:in `block in top_level'
/usr/local/lib/ruby/1.9.1/rake/application.rb:133:in `standard_exception_handling'
/usr/local/lib/ruby/1.9.1/rake/application.rb:88:in `top_level'
/usr/local/lib/ruby/1.9.1/rake/application.rb:66:in `block in run'
/usr/local/lib/ruby/1.9.1/rake/application.rb:133:in `standard_exception_handling'
/usr/local/lib/ruby/1.9.1/rake/application.rb:63:in `run'
/usr/local/bin/rake:32:in `<main>'
rake aborted!

我已将 worker 的 perform 函数中的所有代码封装在 begin/rescue 块中,以尝试捕获异常但无济于事,这让我认为它来自 Resque 内部的某个地方。

我尝试使用原始数据将 Resque 工作器排入队列,然后在工作器内部将其解析为 JSON 并设置 UTF-8 编码:

raw_data.each do |msg|
  msg = msg.encode("UTF-8", :invalid => :replace, :undef => :replace, :replace => "")                        
  parsed_msg = JSON.parse(msg) rescue nil                                                                     
  next if parsed_msg.nil?                                                                                     
  parsed_data << parsed_msg                                                                                   
 end

我仍然得到同样的错误。 它并不总是同一个字符,如果我没记错的话,有时是 \xC2 或 \xD8

有什么想法吗?

【问题讨论】:

    标签: ruby character-encoding resque


    【解决方案1】:

    会不会是文件编码不正确?

    尝试插入:

    # encoding: UTF-8
    

    在相关 ruby​​ 源文件的顶部。这是 Ruby 1.9 中最令人讨厌的事情之一。

    【讨论】:

      猜你喜欢
      • 2011-03-24
      • 1970-01-01
      • 2019-07-02
      • 1970-01-01
      • 1970-01-01
      • 2012-06-20
      • 2011-03-28
      • 1970-01-01
      相关资源
      最近更新 更多