本文简要介绍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 行)上的魔术注释来更改它。注释必须包含单词 coding
或 encoding
,后跟冒号、空格和 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 Encoding.compatible?用法及代码示例
- Ruby Encoding.list用法及代码示例
- Ruby Encoding.locale_charmap用法及代码示例
- Ruby Encoding.ascii_compatible?用法及代码示例
- Ruby Encoding.dummy?用法及代码示例
- Ruby Encoding.name_list用法及代码示例
- Ruby Encoding.inspect用法及代码示例
- Ruby Encoding.to_s用法及代码示例
- Ruby Encoding.name用法及代码示例
- Ruby Encoding.names用法及代码示例
- Ruby Encoding.aliases用法及代码示例
- Ruby Encoding.find用法及代码示例
- Ruby Enumerable.any?用法及代码示例
- Ruby Enumerable min_by()用法及代码示例
- Ruby Enumerable each_witth_object()用法及代码示例
- Ruby Enumerable.slice_before用法及代码示例
- Ruby Enumerable each_cons()用法及代码示例
- Ruby Enumerator each_with_index用法及代码示例
- Ruby Enumerable.uniq用法及代码示例
- Ruby Enumerator each_with_object用法及代码示例
- Ruby Enumerable uniq()用法及代码示例
- Ruby Enumerable.find_all用法及代码示例
- Ruby Enumerator.peek_values用法及代码示例
- Ruby Enumerable.max用法及代码示例
- Ruby Enumerable.map用法及代码示例
注:本文由纯净天空筛选整理自ruby-lang.org大神的英文原创作品 Encoding类。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。