指定字符编码的方式有什么区别?

时间:2011-12-11 22:28:22

标签: ruby encoding shebang

我已经看到了几种指定字符串编码的方法,如下所示:

  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"
  7. 还有其他吗?有人可以告诉我他们的差异,如果有的话,他们的起源是否有?是旧的还是新的;次要的和受欢迎的;折旧的和赞赏的?

2 个答案:

答案 0 :(得分:4)

TL; DR版本:使用# coding: utf-8# encoding: utf-8;它们是现代的,它们之间没有区别。


根据这个most enlightening article在Ruby 1.9中,规则是魔术评论必须是:

  

您的代码的第一行是一个注释,其中包含单词编码,后跟冒号和空格,然后是编码名称......

所以涵盖1,2和2 3也可能包含# foobarcoding: utf-8之类的东西。这是Ruby 1.9的首选方法。

出于兼容性原因,保留了Ruby 1.8中的哈希爆炸-K*开关,其中包含4个。

第五和第六个数字略有不同。我建议阅读前面提到的文章,看看外部和内部编码是如何工作的。然而,要点是,当您通过IO对象读取数据时,重要的是如何对数据进行编码以便正确读取数据。外部编码表达了这一点。因此,当您将外部编码设置为UTF-8时,您暗示您正在读取的文件以UTF-8编码。内部编码是Ruby应该从哪个编码自动转换该操作的结果字符串。

当未明确设置外部编码时,将使用您设置的默认值。这些默认值可以通过哈希爆炸中的-E标志来更改(数字5;因此5和6可以相同地工作)。

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

答案 1 :(得分:1)

第二个和第三个基本相同,您在逐个文件的基础上指定编码。你只需要“编码”,但因为“编码”包含“编码”这个词,所以也可以。我不记得其他人,但是Peter Cooper's Ruby 1.9 walkthrough解决了一些不同之处。