我见过几种指定字符串编码的方法,如下所示:
# -*- coding: utf-8 -*-
# coding: utf-8
# encoding: utf-8
#!/usr/bin/env ruby -Ku
#!/usr/bin/env ruby -Eutf-8
Encoding.default_external = "utf-8"
还有其他的吗?有人可以告诉我它们的区别(如果有的话),以及它们的来源(如果有的话)?有旧的和新的吗?次要的和流行的;贬值的和赞赏的?
TL;DR 版本:使用# coding: utf-8
or # encoding: utf-8
; 它们是现代的,它们之间没有区别。
根据这篇最具启发性的文章在 Ruby 1.9 中,规则是魔术注释必须是:
代码的第一行是包含单词编码的注释,后跟冒号和空格,然后是编码名称...
所以这涵盖了 1、2 和 3,并且可能还包括类似# foobarcoding: utf-8
的东西。这是 Ruby 1.9 的首选方法。
出于兼容性原因,保留了-K*
Ruby 1.8 中的 hash bang 开关,它涵盖了 4 个。
数字五和六涵盖了稍微不同的东西。我建议通读前面链接的文章,了解外部和内部编码是如何工作的。但是要点是,当您通过 IO 对象读取数据时,如何对数据进行编码以正确读取数据很重要。外部编码正是表达了这一点。因此,当您将外部编码设置为 UTF-8 时,意味着您正在读取的文件是以 UTF-8 编码的。内部编码是 Ruby 应该自动转码该操作的结果字符串的编码。
当未明确设置外部编码时,将使用您设置的默认值。这些默认值可以通过-E
hash bang 中的标志进行更改(数字 5;因此 5 和 6 的工作方式相同)。
传递-U
会将内部编码设置为 UTF-8(意味着读取时字符串将自动转码为 UTF-8)。
第 2 和第 3 基本相同,您在逐个文件的基础上指定编码。您只需要“编码”,但因为“编码”包含“编码”一词,所以也可以。我不记得其他人了,但是Peter Cooper 的 Ruby 1.9 演练介绍了一些差异。