本文簡要介紹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類。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。