【问题标题】:sidekiq active_job perform_later with text that includes UTF-8 characters带有包含 UTF-8 字符的文本的 sidekiq active_job perform_later
【发布时间】:2021-07-29 00:42:16
【问题描述】:

我刚刚在我调用的地方发现了这个错误

MyJob.perform_later(request.body.read)

使用 sidekiq active_job 作业,

调用 request.body.read 返回一些 json,我认为在某些情况下它可能包含 UTF-8 字符(即 € 符号),

在这种情况下,我得到了

Encoding::UndefinedConversionError Exception: "\xE2" from ASCII-8BIT to UTF-8

我知道 sidekiq 建议不要使用复杂或冗长的作业参数,最佳实践解决方法是什么?

我能想到的是在将字符串传递给作业之前对字符串进行base64编码(但这会使sidekiq变得更长,我不确定这是否会成为问题) 或者将实际的 json 文本存储在 db 表中,然后将新行的 id 传递给作业。这肯定行得通,但对我来说似乎有点矫枉过正。

有什么建议吗?

【问题讨论】:

    标签: utf-8 sidekiq rails-activejob


    【解决方案1】:

    Sidekiq 将使用JSON.generate 序列化作业参数。这是您可以在控制台中运行的 ASCII-8BIT 字符串发生的情况的示例:

    arg = "Example with € character".force_encoding('ASCII-8BIT')
    JSON.generate([arg])
    Encoding::UndefinedConversionError ("\xE2" from ASCII-8BIT to UTF-8)
    

    一种选择是遵循this answer 并在将编码传递给perform_later 之前强制编码为UTF-8。然后它会正确序列化:

    arg = "Example with € character".force_encoding('ASCII-8BIT')
    arg.force_encoding('UTF-8')
    JSON.generate([arg])
     => "[\"Example with € character\"]"
    

    所以你会想要这样的东西:

    MyJob.perform_later(request.body.read.force_encoding('UTF-8'))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-06
      • 1970-01-01
      • 2018-09-21
      • 2016-04-24
      • 1970-01-01
      • 2016-06-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多