当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Ruby Encoding类用法及代码示例


本文简要介绍ruby语言中 Encoding类 的用法。

Encoding 实例表示可在 Ruby 中使用的字符编码。它被定义为 Encoding 命名空间下的常量。它有一个名称和可选的别名:

Encoding::ISO_8859_1.name
#=> "ISO-8859-1"

Encoding::ISO_8859_1.names
#=> ["ISO-8859-1", "ISO8859-1"]

处理编码的 Ruby 方法返回或接受 Encoding 实例作为参数(当方法接受 Encoding 实例作为参数时,可以改为传递 Encoding 名称或别名)。

"some string".encoding
#=> #<Encoding:UTF-8>

string = "some string".encode(Encoding::ISO_8859_1)
#=> "some string"
string.encoding
#=> #<Encoding:ISO-8859-1>

"some string".encode "ISO-8859-1"
#=> "some string"

Encoding::ASCII_8BIT 是一种特殊的编码,通常用于字节串,而不是字符串。但顾名思义,它在 ASCII 范围内的字符被视为 ASCII 字符。当您将 ASCII-8BIT 字符与其他 ASCII 兼容字符一起使用时,这很有用。

更改编码

String 的关联 Encoding 可以通过两种不同的方式进行更改。

首先,可以使用 String#force_encoding 将字符串的 Encoding 设置为新的 Encoding 而无需更改字符串的内部字节表示。这就是告诉 Ruby 字符串的正确编码的方法。

string
#=> "R\xC3\xA9sum\xC3\xA9"
string.encoding
#=> #<Encoding:ISO-8859-1>
string.force_encoding(Encoding::UTF_8)
#=> "R\u00E9sum\u00E9"

其次,可以对字符串进行转码,即将其内部字节表示转换为另一种编码。其关联编码也设置为其他编码。有关各种形式的转码,请参见 String#encode ,有关转码过程的其他控制,请参见 Encoding::Converter 类。

string
#=> "R\u00E9sum\u00E9"
string.encoding
#=> #<Encoding:UTF-8>
string = string.encode!(Encoding::ISO_8859_1)
#=> "R\xE9sum\xE9"
string.encoding
#=> #<Encoding::ISO-8859-1>

脚本编码

所有 Ruby 脚本代码都有一个关联的 Encoding ,在源代码中创建的任何 String 文字都将与之关联。

默认的脚本编码是 v2.0 之后的 Encoding::UTF_8,但可以通过源代码文件第一行(或第二行,如果第一行有 shebang 行)上的魔术注释来更改它。注释必须包含单词 codingencoding ,后跟冒号、空格和 Encoding 名称或别名:

# encoding: UTF-8

"some string".encoding
#=> #<Encoding:UTF-8>

__ENCODING__ 关键字返回写入该关键字的文件的脚本编码:

# encoding: ISO-8859-1

__ENCODING__
#=> #<Encoding:ISO-8859-1>

ruby -K 将更改默认语言环境编码,但不建议这样做。 Ruby 源文件应通过魔术注释声明其脚本编码,即使它们仅依赖于US-ASCII 字符串或正则表达式。

语言环境编码

环境的默认编码。通常来自语言环境。

Encoding.locale_charmap , Encoding.find (‘locale’)

文件系统编码

来自环境文件系统的字符串的默认编码。这用于文件名或路径的字符串。

Encoding.find (‘filesystem’)

外部编码

每个 IO 对象都有一个外部编码,它指示 Ruby 将用于读取其数据的编码。默认情况下,Ruby 将 IO 对象的外部编码设置为默认外部编码。默认外部编码由语言环境编码或解释器-E 选项设置。 Encoding.default_external 返回外部编码的当前值。

ENV["LANG"]
#=> "UTF-8"
Encoding.default_external
#=> #<Encoding:UTF-8>

$ ruby -E ISO-8859-1 -e "p Encoding.default_external"
#<Encoding:ISO-8859-1>

$ LANG=C ruby -e 'p Encoding.default_external'
#<Encoding:US-ASCII>

默认的外部编码也可以通过 Encoding.default_external= 设置,但您不应该这样做,因为更改前后创建的字符串会有不一致的编码。而是使用 ruby -E 以正确的外部编码调用 ruby。

当您知道 IO 对象的数据的实际编码不是默认的外部编码时,您可以使用 IO#set_encoding 重置其外部编码或在 IO 对象创建时设置它(请参阅 IO.new 选项)。

内部编码

要处理编码与外部编码不同的 IO 对象的数据,您可以设置其内部编码。当从 IO 对象中读取数据时,Ruby 将使用此内部编码对数据进行转码。

相反,当数据写入 IO 对象时,它会从内部编码转码为 IO 对象的外部编码。

IO 对象的内部编码可以使用 IO#set_encoding 或在 IO 对象创建时设置(请参阅 IO.new 选项)。

内部编码是可选的,如果未设置,则使用 Ruby 默认的内部编码。如果未明确设置此默认内部编码为nil,则表示默认情况下不会发生转码。

可以使用解释器选项 -E 设置默认内部编码。 Encoding.default_internal 返回当前的内部编码。

$ ruby -e 'p Encoding.default_internal'
nil

$ ruby -E ISO-8859-1:UTF-8 -e "p [Encoding.default_external, \
  Encoding.default_internal]"
[#<Encoding:ISO-8859-1>, #<Encoding:UTF-8>]

默认内部编码也可以通过 Encoding.default_internal= 设置,但您不应该这样做,因为更改前后创建的字符串会有不一致的编码。而是使用 ruby -E 以正确的内部编码调用 ruby。

IO 编码示例

在以下示例中,将 UTF-8 编码字符串 “Ru00E9sumu00E9” 转码以输出为 ISO-8859-1 编码,然后读回并转码为 UTF-8:

string = "R\u00E9sum\u00E9"

open("transcoded.txt", "w:ISO-8859-1") do |io|
  io.write(string)
end

puts "raw text:"
p File.binread("transcoded.txt")
puts

open("transcoded.txt", "r:ISO-8859-1:UTF-8") do |io|
  puts "transcoded text:"
  p io.read
end

写入文件时,未指定内部编码,因为它仅用于读取。在读取文件时,必须指定内部和外部编码以获得正确的结果。

$ ruby t.rb
raw text:
"R\xE9sum\xE9"

transcoded text:
"R\u00E9sum\u00E9"

相关用法


注:本文由纯净天空筛选整理自ruby-lang.org大神的英文原创作品 Encoding类。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。