从shell到cronjob时,Ruby文件编码的行为有所不同

时间:2014-09-09 17:03:52

标签: ruby cron

我有一个Ruby脚本,可以创建一个字符串并写入文件。当我从我的shell运行它,它工作正常。当我将其作为cronjob运行时,当我尝试写入文件时,我收到错误invalid byte sequence is US-ASCII。当我以任何一种方式运行它时,都会使用相同版本的Ruby。为什么会这样?

1 个答案:

答案 0 :(得分:2)

最终在文件中的字符串编码由 Encoding.default_external 确定。

除非您明确设置,否则default_external编码由您的环境决定。

因此,您的两个不同环境必须具有不同的设置。您可以通过查看以下输出来确定命令行上的本地设置:

$ echo $LC_CTYPE (blank on OSX)

或:

$ echo $LANG

您可以通过执行以下操作来确定ruby程序中的default_external编码:

puts Encoding.default_external.name

我会将该行添加到您的ruby程序中,然后在每个环境中运行您的代码并检查输出。

要覆盖环境的设置,您可以在程序中明确设置default_encoding:

Encoding.default_external = "UTF-8"

或者,一种更加手术精确的方法是在打开文件时设置文件的外部编码:

File.open('output.txt', 'w:UTF-8') do |f|
   ...
end