Ruby 程式設計/編碼
隨著 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 類的兩種方法完成:encode 和 force_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")
Ruby 還包括一個假編碼:ASCII-8 位或 BINARY。BINARY 用於二進位制資料。
#encoding: ISO-8859-1