sidekiq active_job perform_later 文本包含 UTF-8 字符
sidekiq active_job perform_later with text that includes UTF-8 characters
我刚刚在我打电话的地方发现了这个错误
MyJob.perform_later(request.body.read)
有 sidekiq active_job 工作,
调用 request.body.read
returns 一些 json,我认为在某些情况下它可能包含 UTF-8 字符(即欧元符号),
在这种情况下,我得到
Encoding::UndefinedConversionError Exception: "\xE2" from ASCII-8BIT to UTF-8
我知道 sidekiq 建议不要使用复杂或冗长的作业参数,最佳实践解决方法是什么?
我能想到的是在将字符串传递给作业之前对其进行 base64 编码(但这会使 sidekiq 的时间更长,我不确定这是否会成为问题)
或者将实际的 json 文本存储在数据库 table 中,然后将新行的 ID 传递给作业。这肯定有用,但对我来说似乎有点矫枉过正。
有什么建议吗?
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'))
我刚刚在我打电话的地方发现了这个错误
MyJob.perform_later(request.body.read)
有 sidekiq active_job 工作,
调用 request.body.read
returns 一些 json,我认为在某些情况下它可能包含 UTF-8 字符(即欧元符号),
在这种情况下,我得到
Encoding::UndefinedConversionError Exception: "\xE2" from ASCII-8BIT to UTF-8
我知道 sidekiq 建议不要使用复杂或冗长的作业参数,最佳实践解决方法是什么?
我能想到的是在将字符串传递给作业之前对其进行 base64 编码(但这会使 sidekiq 的时间更长,我不确定这是否会成为问题) 或者将实际的 json 文本存储在数据库 table 中,然后将新行的 ID 传递给作业。这肯定有用,但对我来说似乎有点矫枉过正。
有什么建议吗?
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'))