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