3

我见过几种指定字符串编码的方法,如下所示:

  1. # -*- coding: utf-8 -*-
  2. # coding: utf-8
  3. # encoding: utf-8
  4. #!/usr/bin/env ruby -Ku
  5. #!/usr/bin/env ruby -Eutf-8
  6. Encoding.default_external = "utf-8"

还有其他的吗?有人可以告诉我它们的区别(如果有的话),以及它们的来源(如果有的话)?有旧的和新的吗?次要的和流行的;贬值的和赞赏的?

4

2 回答 2

4

TL;DR 版本:使用# coding: utf-8or # 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 应该自动转码该操作的结果字符串的编码。

当未明确设置外部编码时,将使用您设置的默认值。这些默认值可以通过-Ehash bang 中的标志进行更改(数字 5;因此 5 和 6 的工作方式相同)。

传递-U会将内部编码设置为 UTF-8(意味着读取时字符串将自动转码为 UTF-8)。

于 2011-12-11T23:00:15.393 回答
1

第 2 和第 3 基本相同,您在逐个文件的基础上指定编码。您只需要“编码”,但因为“编码”包含“编码”一词,所以也可以。我不记得其他人了,但是Peter Cooper 的 Ruby 1.9 演练介绍了一些差异。

于 2011-12-11T22:50:36.737 回答