如何避免将魔术编码注释放在 Ruby 1.9 中每个 UTF-8 文件的顶部?

Posted

技术标签:

【中文标题】如何避免将魔术编码注释放在 Ruby 1.9 中每个 UTF-8 文件的顶部?【英文标题】:How can I avoid putting the magic encoding comment on top of every UTF-8 file in Ruby 1.9? 【发布时间】:2011-03-18 11:43:15 【问题描述】:

我有一个 Rails 项目,里面有很多西里尔字母。

它在 Ruby 1.8 上运行良好,但 Ruby 1.9 假定源文件是 US-ASCII 编码的,除非您在源文件顶部提供 # encoding: utf-8 注释。此时文件不被视为US-ASCII

有没有更简单的方法告诉 Ruby“此应用程序是 UTF8 编码的。除非另有声明,否则请将所有和任何包含的源文件视为 UTF8”?


更新:

我写了“How to insert the encoding: UTF-8 directive automatically in Ruby 1.9 files”,如果需要,它会自动附加编码指令。

【问题讨论】:

James Gray 写了a series of articles 处理 Unicode 和 Ruby。处理源文件是该系列的一部分。读书很好。 5 年后:升级到 ruby​​ 2.0+,默认为 UTF-8 (ruby-lang.org/en/news/2013/02/24/ruby-2-0-0-p0-is-released) 【参考方案1】:

我觉得你也可以

    使用-E utf-8 命令行参数到ruby,或者 将RUBYOPT 环境变量设置为"-E utf-8"

【讨论】:

建议使用只设置外部编码。要设置外部和内部编码,请使用-E utf-8:utf-8【参考方案2】:

在我看来,显式并不总是比隐式更好。

当您使用的几乎所有源代码都兼容 UTF-8 时,您可以通过使用 Ruby 的 -Ku 命令行选项轻松避免使用魔法编码注释。

不要将-K 选项的“u”参数与-U 选项混淆。

-Ku : set internal and script encoding to utf-8
-U  : set internal encoding to utf-8

然后,仅在需要它的脚本中设置魔法编码注释。请记住,约定优于配置!

可以设置环境变量RUBYOPT=-Ku

请参阅http://www.manpagez.com/man/1/ruby/ 上的 Ruby 命令行选项。

【讨论】:

Ruby 的命令行选项可通过在 *nix 和 Mac OS 上键入 man rubyinfo ruby 在命令行中使用。 对于 Rails,添加 -Ku 参数ìn script/rails 文件【参考方案3】:

显式优于隐式。写出编码的名称对您的文本编辑器、解释器和任何其他想要查看文件的人都有好处。不同的平台有不同的默认值——UTF-8、Windows-1252、Windows-1251 等——如果您自动选择其中一个,您将阻碍可移植性或平台集成。要求更明确的编码是一件好事。

将 Rails 应用程序与 GetText 集成可能是个好主意。然后你所有的 UTF-8 字符串将被隔离到少量的翻译文件中,你的 Ruby 模块将是干净的 ASCII。

【讨论】:

+1 将非 ASCII 字符串拆分到单独的文件中是解决问题的好方法。或者,将它们放入 DB 或 YAML 文件中的表格中,这样可以更轻松地调整语言,而无需接触源代码。 要求显式编码是好的。但是,Ruby 隐含地为所有文件选择 ASCII-8BIT。应该可以显式设置不同的默认值。例如,对于完全使用 UTF-8 字符串的应用程序,必须在每个文件中包含魔术注释是没有意义的,是吗?【参考方案4】:

不是一个直接的答案,但根据您的编码环境,您可以让编辑器处理事情。例如 Emacs 的 ruby-mode 有变量 ruby-insert-encoding-magic-comment

ruby-insert-encoding-magic-comment 是 在“ruby-mode.el”中定义的变量 它的值为 t

文档: *如果这是非零,则在保存时插入一个神奇的 emacs 'coding' 注释。

您可以自定义此变量。

我相信其他编辑也有类似的情况。当然,这仍然意味着将魔术注释添加到每个文件,但至少编辑器会自动为您执行此操作,而无需您记住。

【讨论】:

【参考方案5】:

有一个 gem 可以在 Rails 项目中需要它的每个文件的顶部设置魔术注释:https://github.com/m-ryan/magic_encoding

您只需安装它并在项目的根目录中运行magic_encoding,问题就解决了。

【讨论】:

超级简单,速度极快。【参考方案6】:

确保所有文件(源和资产)在运行时以首选编码加载的唯一万无一失(并且 DRY!)1.9 方法是使用 -E 命令行参数。

所有其他方法都有缺点,具体取决于您的系统(例如,无法设置 ENV 变量,首先加载的第三方代码导致不适合使用 Encoding.default_external,...)。

我的生产服务器使用以下包装脚本:

#!/bin/bash
exec /usr/local/rvm/rubies/default/bin/ruby -E utf-8:utf-8 "$@"

(一定要适应路径)

【讨论】:

【参考方案7】:

我没有遇到这么多,但是当我需要确保 UTF-8 时,我使用 $KCODE 全局。试着把它放在你的环境中。rb:$KCODE = 'UTF8'

另外,您确定您的编辑器正在以 UTF-8 格式保存文件吗?

【讨论】:

KCODE 不影响源解析,afaik。

以上是关于如何避免将魔术编码注释放在 Ruby 1.9 中每个 UTF-8 文件的顶部?的主要内容,如果未能解决你的问题,请参考以下文章

我可以在 Ruby 1.9 上设置默认字符串编码吗?

如何避免Eclipse在将类名放在注释中的时候导入类,让checkstyle以后不报错?

手工测试用例就是自动化测试脚本——使用ruby 1.9新特性进行自动化脚本的编写

ruby 1.9 中有没有办法从字符串中删除无效的字节序列?

Python代码规范:代码规范整改和编码技巧-pylint扫描问题整改

Ruby 1.9:将字节数组转换为具有多字节 UTF-8 字符的字符串