跳至内容

Ruby 编程/编码

来自维基教科书,开放书籍,开放世界

← ASCII | 对象简介 →


编码支持

[编辑 | 编辑源代码]

随着 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 类的两种方法完成:encodeforce_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")

ASCII-8 位

[编辑 | 编辑源代码]

Ruby 还包括一个假编码:ASCII-8 位或 BINARY。BINARY 用于二进制数据。

#encoding: ISO-8859-1

华夏公益教科书