sidekiq活动作业稍后使用包含UTF-8字符的文本执行
我刚刚在我打电话的地方发现了这个窃听器sidekiq活动作业稍后使用包含UTF-8字符的文本执行,utf-8,sidekiq,rails-activejob,Utf 8,Sidekiq,Rails Activejob,我刚刚在我打电话的地方发现了这个窃听器 MyJob.perform_later(request.body.read) 有了sidekiq的活跃工作 调用request.body.read返回一些json,我认为在某些情况下它可能包含UTF-8字符(即€symbol) 在这种情况下,我会 Encoding::UndefinedConversionError Exception: "\xE2" from ASCII-8BIT to UTF-8 我知道sidekiq建议不要有复
MyJob.perform_later(request.body.read)
有了sidekiq的活跃工作
调用request.body.read
返回一些json,我认为在某些情况下它可能包含UTF-8字符(即€symbol)
在这种情况下,我会
Encoding::UndefinedConversionError Exception: "\xE2" from ASCII-8BIT to UTF-8
我知道sidekiq建议不要有复杂或长时间的工作参数,什么是最佳实践解决方案
我能想到的是在将字符串传递到作业之前对其进行base64编码(但这会使sidekiq的代码更长,我不确定这是否会成为问题)
或者将实际的json文本存储在db表中,并将新行的id传递给作业。这肯定行得通,但对我来说似乎有点过头了
有什么建议吗?Sidekiq将使用
JSON.generate
序列化作业参数。这是可以在控制台中运行的ASCII-8BIT
字符串的示例:
arg=“带有欧元字符的示例”。强制编码('ASCII-8BIT'))
JSON.generate([arg])
编码::未定义的转换器错误(“\xE2”从ASCII-8BIT到UTF-8)
一种选择是在将编码传递到perform\u(稍后执行)
之前,遵循并强制编码为UTF-8。然后它将正确序列化:
arg=“带有欧元字符的示例”。强制编码('ASCII-8BIT'))
参数强制编码('UTF-8')
JSON.generate([arg])
=>“[\”带有欧元字符\“]的示例”
所以你想要的是:
MyJob.perform_later(request.body.read.force_encoding('UTF-8'))