Ruby 编程/编码
随着 Ruby 1.9 的出现,Ruby 现在支持除 US-ASCII 以外的其他编码,用于字符串、IO 和源代码。在 Mac OSX Lion 上安装 Ruby 1.9.3 MRI 时,Ruby 具有以下编码
- ASCII-8BIT
- UTF-8
- US-ASCII
- Big5
- Big5-HKSCS
- Big5-UAO
- CP949
- Emacs-Mule
- EUC-JP
- EUC-KR
- EUC-TW
- GB18030
- GBK
- ISO-8859-1
- ISO-8859-2
- ISO-8859-3
- ISO-8859-4
- ISO-8859-5
- ISO-8859-6
- ISO-8859-7
- ISO-8859-8
- ISO-8859-9
- ISO-8859-10
- ISO-8859-11
- ISO-8859-13
- ISO-8859-14
- ISO-8859-15
- ISO-8859-16
- KOI8-R
- KOI8-U
- Shift_JIS
- UTF-16BE
- UTF-16LE
- UTF-32BE
- UTF-32LE
- Windows-1251
- IBM437
- IBM737
- IBM775
- CP850
- IBM852
- CP852
- IBM855
- CP855
- IBM857
- IBM860
- IBM861
- IBM862
- IBM863
- IBM864
- IBM865
- IBM866
- IBM869
- Windows-1258
- GB1988
- macCentEuro
- macCroatian
- macCyrillic
- macGreek
- macIceland
- macRoman
- macRomania
- macThai
- macTurkish
- macUkraine
- CP950
- CP951
- stateless-ISO-2022-JP
- eucJP-ms
- CP51932
- GB2312
- GB12345
- ISO-2022-JP
- ISO-2022-JP-2
- CP50220
- CP50221
- Windows-1252
- Windows-1250
- Windows-1256
- Windows-1253
- Windows-1255
- Windows-1254
- TIS-620
- Windows-874
- Windows-1257
- Windows-31J
- MacJapanese
- UTF-7
- UTF8-MAC
- UTF-16
- UTF-32
- UTF8-DoCoMo
- SJIS-DoCoMo
- UTF8-KDDI
- SJIS-KDDI
- ISO-2022-JP-KDDI
- stateless-ISO-2022-JP-KDDI
- UTF8-SoftBank
- SJIS-SoftBank
默认情况下,从 Ruby 2.0 开始,所有 Ruby 源文件都使用 UTF-8 编码。更改文件编码的常用方法是使用所谓的“魔术注释”。魔术注释必须直接出现在文件开头,或者直接出现在 shebang 注释 之后。魔术注释的语法只要求一件事:注释包含文本 coding:
后跟编码名称。所以以下都是有效的魔术注释
#encoding: UTF-8
#coding: UTF-8
#blah blah coding: US-ASCII
魔术注释告诉解释器,源代码本身以及其中的所有字符串都将使用给定的编码。所以,虽然这段代码有效
#encoding: ISO-8859-1
puts "Olé!"
但这段代码无效
#encoding: US-ASCII
puts "Olé!"
因为第一个代码片段声明文件的编码为 ISO-8859-1(US-ASCII 的扩展,为法语和西班牙语等语言添加了重音字符),字符“é”是有效的。但是,在 US-ASCII 中,“é”是无效字符,会导致错误。
您也可以在文件中为单个字符串指定编码(尽管文字中的字符仍必须使用魔术注释声明的编码,或通过转义序列插入)。这可以通过 String 类的两种方法完成:encode
和 force_encoding
。
encode
用于转码。假设给定 ISO-8859-1 字符串“Olé!”,您可以使用 encode
将其转换为 UTF-8,UTF-8 包含所有相同的字符。但是,您不能将 ISO-8859-1 字符串转码为 US-ASCII,除非它只包含 ASCII 字符(例如“Hello”)。encode
有很多选项,可以进行广泛配置。查看其文档。以下是 encode
的关键:虽然字符的视觉显示和含义保持不变,但底层的字节很可能不会。encode
可以自由更改字符串的底层字节。示例
#encoding: ISO-8859-1
"Olé!".encode("UTF-8") #Valid
"Olé!".encode("US-ASCII") #Error
force_encoding
用于告诉 Ruby 字符串的编码,该字符串已经包含该编码的正确字节(例如,从 ISO-8859-1 程序中的文件中读取的 UTF-8 字符串)。force_encoding
永远不会修改字符串的底层字节。示例
#encoding: ISO-8859-1
"\u27d8".force_encoding("UTF-8")
Ruby 还包括一个假编码:ASCII-8 位或 BINARY。BINARY 用于二进制数据。
#encoding: ISO-8859-1