ruby中的魔术评论(#编码:utf-8)如何工作?

时间:2012-01-16 11:17:53

标签: ruby encoding

红宝石中的神奇评论如何运作?我在说:

# Encoding: utf-8

这是一个预处理指令吗?这种结构还有其他用途吗?

4 个答案:

答案 0 :(得分:58)

出于某种原因,人们将此行称为魔术评论。在处理源代码之前,解释器会读取此行并设置正确的编码。我相信它对解释语言来说很常见。至少Python使用相同的方法。

您可以通过多种不同方式指定编码(其中一些方式可由编辑者识别):

# encoding: UTF-8
# coding: UTF-8
# -*- coding: UTF-8 -*-

您可以在this article中阅读有关源编码的一些有趣内容。

我所知道的唯一具有类似构造的是shebang,但它通常与Unix shell有关,并且不是特定于Ruby的。

答案 1 :(得分:14)

这个神奇的评论告诉Ruby当前解析文件的源编码。正如Ruby 1.9.x默认假设为US_ASCII,如果使用非ASCII字符(如变音符号或重音字符),则告诉解释器源代码的编码。

评论必须是文件的第一行(或者如果使用的话,在shebang下面)才能被识别。

还有其他编码设置。有关详细信息,请参阅this question

从2.0版开始,Ruby默认采用源文件的UTF-8编码。因此,如果您使用UTF-8编写源代码,这种神奇的编码注释已成为一种罕见的视觉效果。

答案 2 :(得分:7)

正如您所指出的,魔术评论是一种特殊的预处理结构。必须在文件顶部定义它们(除非顶部已有unix shebang)。从Ruby 2.3开始,有三种魔术评论:

  • 编码评论:请参阅其他答案。必须始终是第一个神奇的评论。必须与ASCII兼容。设置源编码,因此如果文件的实际编码与指定的编码
  • 不匹配,则会遇到问题
  • frozen_string_literal: true:冻结当前文件中的所有字符串文字
  • warn_indent: true:激活当前文件的缩进警告

更多信息:Magic Instructions

答案 3 :(得分:0)

虽然这并不是您所要解决的问题的答案,但是,如果您想了解有关编码的更多信息,它们如何工作,出现哪些问题:伟大的Yehuda Katz在编写编码时就谈到了编码在Ruby 1.9及更高版本中:

Ruby 1.9 Encodings: A Primer and the Solution for Rails

Encodings, Unabridged