跳至內容

Ruby 程式設計/編碼

來自華夏公益教科書,開放書籍,開放世界

← ASCII | 物件簡介 →


編碼支援

[編輯 | 編輯原始碼]

隨著 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 類的兩種方法完成:encodeforce_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")

ASCII-8 位

[編輯 | 編輯原始碼]

Ruby 還包括一個假編碼:ASCII-8 位或 BINARY。BINARY 用於二進位制資料。

#encoding: ISO-8859-1

華夏公益教科書