編碼類別
編碼實例代表 Ruby 中可用的字元編碼。它定義為編碼命名空間下的常數。它有一個名稱,並可選擇別名
Encoding::US_ASCII.name # => "US-ASCII" Encoding::US_ASCII.names # => ["US-ASCII", "ASCII", "ANSI_X3.4-1968", "646"]
接受編碼作為參數的 Ruby 方法將接受
-
編碼物件。
-
編碼名稱。
-
編碼名稱的別名。
這些是等效的
'foo'.encode(Encoding::US_ASCII) # Encoding object. 'foo'.encode('US-ASCII') # Encoding name. 'foo'.encode('ASCII') # Encoding alias.
有關編碼及其用途的完整討論,請參閱 編碼文件。
編碼::ASCII_8BIT 是一種特殊用途的編碼,通常用於位元組字串,而不是字元字串。但正如名稱所示,其 ASCII 範圍內的字元被視為 ASCII 字元。當您使用其他相容於 ASCII 的編碼時,這很有用。
公開類別方法
傳回可用編碼別名和原始編碼名稱的雜湊。
Encoding.aliases #=> {"BINARY"=>"ASCII-8BIT", "ASCII"=>"US-ASCII", "ANSI_X3.4-1968"=>"US-ASCII", "SJIS"=>"Windows-31J", "eucJP"=>"EUC-JP", "CP932"=>"Windows-31J"}
static VALUE rb_enc_aliases(VALUE klass) { VALUE aliases[2]; aliases[0] = rb_hash_new(); aliases[1] = rb_ary_new(); st_foreach(global_enc_table.names, rb_enc_aliases_enc_i, (st_data_t)aliases); return aliases[0]; }
檢查兩個物件的相容性。
如果物件都是字串,則當它們可以串接時,它們是相容的。如果它們相容,則會傳回串接字串的編碼;如果它們不相容,則傳回 nil。
Encoding.compatible?("\xa1".force_encoding("iso-8859-1"), "b") #=> #<Encoding:ISO-8859-1> Encoding.compatible?( "\xa1".force_encoding("iso-8859-1"), "\xa1\xa1".force_encoding("euc-jp")) #=> nil
如果物件是非字串,則當它們有編碼時,它們的編碼是相容的,而且
-
任一編碼都相容於 US-ASCII
-
其中一個編碼是 7 位元編碼
static VALUE enc_compatible_p(VALUE klass, VALUE str1, VALUE str2) { rb_encoding *enc; if (!enc_capable(str1)) return Qnil; if (!enc_capable(str2)) return Qnil; enc = rb_enc_compatible(str1, str2); if (!enc) return Qnil; return rb_enc_from_encoding(enc); }
傳回預設外部編碼。
預設外部編碼預設用於從下列位置建立的字串
-
檔案
從磁碟讀取的資料 -
SDBM
雖然從這些位置建立的字串會有這個編碼,但編碼可能無效。請務必檢查 字串#valid_encoding?
。
寫入磁碟的 檔案
資料將在寫入時轉碼為預設外部編碼,如果 default_internal
不是 nil。
預設外部編碼由 -E 選項初始化。如果未設定 -E,則在 Windows 上初始化為 UTF-8,在其他作業系統上初始化為區域設定。
static VALUE get_default_external(VALUE klass) { return rb_enc_default_external(); }
設定預設外部編碼。您不應在 Ruby 程式碼中設定 Encoding::default_external
,因為在變更值之前建立的字串可能與在變更值之後建立的字串具有不同的編碼。相反地,您應使用 ruby -E
來呼叫 Ruby,並使用正確的 default_external。
請參閱 Encoding::default_external
,以取得有關如何使用預設外部編碼的資訊。
static VALUE set_default_external(VALUE klass, VALUE encoding) { rb_warning("setting Encoding.default_external"); rb_enc_set_default_external(encoding); return encoding; }
傳回預設內部編碼。如果預設內部編碼不為 nil,則字串將在下列位置轉碼為預設內部編碼
此外,如果未提供編碼,String#encode
和 String#encode!
會使用預設內部編碼。
指令碼編碼 (__ENCODING__),而非 default_internal
,用作建立的字串編碼。
Encoding::default_internal
初始化為 -E 選項,或在其他情況下為 nil。
static VALUE get_default_internal(VALUE klass) { return rb_enc_default_internal(); }
設定預設內部編碼,或在傳遞 nil 時移除預設內部編碼。您不應在 Ruby 程式碼中設定 Encoding::default_internal
,因為在變更值之前建立的字串可能與在變更值之後建立的字串具有不同的編碼。相反地,您應使用 ruby -E
來呼叫 Ruby,並使用正確的 default_internal。
請參閱 Encoding::default_internal
,以取得有關如何使用預設內部編碼的資訊。
static VALUE set_default_internal(VALUE klass, VALUE encoding) { rb_warning("setting Encoding.default_internal"); rb_enc_set_default_internal(encoding); return encoding; }
使用指定的名稱搜尋編碼。名稱應為字串。
Encoding.find("US-ASCII") #=> #<Encoding:US-ASCII>
此方法接受的名稱包含編碼名稱和別名,包括以下特殊別名
- “external”
-
預設外部編碼
- “internal”
-
預設內部編碼
- “locale”
-
地區編碼
- “filesystem”
-
檔案系統編碼
當沒有名稱的編碼時,會引發 ArgumentError
。不過,只有 Encoding.find("internal")
在沒有名為“internal”的編碼時會傳回 nil,換句話說,當 Ruby 沒有預設內部編碼時。
static VALUE enc_find(VALUE klass, VALUE enc) { int idx; if (is_obj_encoding(enc)) return enc; idx = str_to_encindex(enc); if (idx == UNSPECIFIED_ENCODING) return Qnil; return rb_enc_from_encoding_index(idx); }
傳回已載入編碼的清單。
Encoding.list #=> [#<Encoding:ASCII-8BIT>, #<Encoding:UTF-8>, #<Encoding:ISO-2022-JP (dummy)>] Encoding.find("US-ASCII") #=> #<Encoding:US-ASCII> Encoding.list #=> [#<Encoding:ASCII-8BIT>, #<Encoding:UTF-8>, #<Encoding:US-ASCII>, #<Encoding:ISO-2022-JP (dummy)>]
static VALUE enc_list(VALUE klass) { VALUE ary = rb_ary_new2(0); rb_ary_replace(ary, rb_encoding_list); return ary; }
傳回地區字元集名稱。如果沒有適當的資訊,則傳回 nil。
Debian GNU/Linux LANG=C Encoding.locale_charmap #=> "ANSI_X3.4-1968" LANG=ja_JP.EUC-JP Encoding.locale_charmap #=> "EUC-JP" SunOS 5 LANG=C Encoding.locale_charmap #=> "646" LANG=ja Encoding.locale_charmap #=> "eucJP"
結果高度依賴於平台。因此 Encoding.find(Encoding.locale_charmap)
可能會導致錯誤。如果您需要一些編碼物件,即使是對於未知的地區,可以使用 Encoding.find
(“locale”)。
VALUE rb_locale_charmap(VALUE klass) { #if NO_LOCALE_CHARMAP return rb_usascii_str_new_cstr("US-ASCII"); #else return locale_charmap(rb_usascii_str_new_cstr); #endif }
傳回可用編碼名稱的清單。
Encoding.name_list #=> ["US-ASCII", "ASCII-8BIT", "UTF-8", "ISO-8859-1", "Shift_JIS", "EUC-JP", "Windows-31J", "BINARY", "CP932", "eucJP"]
static VALUE rb_enc_name_list(VALUE klass) { VALUE ary = rb_ary_new2(global_enc_table.names->num_entries); st_foreach(global_enc_table.names, rb_enc_name_list_i, (st_data_t)ary); return ary; }
公開實例方法
傳回是否相容於 ASCII。
Encoding::UTF_8.ascii_compatible? #=> true Encoding::UTF_16BE.ascii_compatible? #=> false
static VALUE enc_ascii_compatible_p(VALUE enc) { return RBOOL(rb_enc_asciicompat(must_encoding(enc))); }
對於虛擬編碼傳回 true。虛擬編碼是一種未正確實作字元處理的編碼。它用於有狀態編碼。
Encoding::ISO_2022_JP.dummy? #=> true Encoding::UTF_8.dummy? #=> false
static VALUE enc_dummy_p(VALUE enc) { return RBOOL(ENC_DUMMY_P(must_encoding(enc))); }
傳回代表編碼的字串,供程式設計人員使用。
Encoding::UTF_8.inspect #=> "#<Encoding:UTF-8>" Encoding::ISO_2022_JP.inspect #=> "#<Encoding:ISO-2022-JP (dummy)>"
static VALUE enc_inspect(VALUE self) { rb_encoding *enc; if (!is_data_encoding(self)) { not_encoding(self); } if (!(enc = DATA_PTR(self)) || rb_enc_from_index(rb_enc_to_index(enc)) != enc) { rb_raise(rb_eTypeError, "broken Encoding"); } return rb_enc_sprintf(rb_usascii_encoding(), "#<%"PRIsVALUE":%s%s%s>", rb_obj_class(self), rb_enc_name(enc), (ENC_DUMMY_P(enc) ? " (dummy)" : ""), rb_enc_autoload_p(enc) ? " (autoload)" : ""); }
傳回編碼的名稱和別名的清單。
Encoding::WINDOWS_31J.names #=> ["Windows-31J", "CP932", "csWindows31J", "SJIS", "PCK"]
static VALUE enc_names(VALUE self) { VALUE args[2]; args[0] = (VALUE)rb_to_encoding_index(self); args[1] = rb_ary_new2(0); st_foreach(global_enc_table.names, enc_names_i, (st_data_t)args); return args[1]; }
傳回編碼的名稱。
Encoding::UTF_8.name #=> "UTF-8"
static VALUE enc_name(VALUE self) { return rb_fstring_cstr(rb_enc_name((rb_encoding*)DATA_PTR(self))); }