當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


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