【问题标题】:Ruby file encoding behaves differently when from the shell vs as a cronjobRuby 文件编码在 shell 和 cronjob 中的行为不同
【发布时间】:2014-09-10 01:47:40
【问题描述】:

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

【问题讨论】:

  • 比较你的环境变量 b/n 你的 shell 和 cron。我的猜测是,您正在设置 LANG 或其他编码变量之一。

标签: ruby cron


【解决方案1】:

文件中的字符串编码由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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-02
    • 1970-01-01
    • 2015-09-27
    • 1970-01-01
    • 1970-01-01
    • 2012-09-25
    相关资源
    最近更新 更多