class Encoding
Encoding 的实例表示 Ruby 中可用的字符编码。 它被定义为 Encoding 命名空间下的常量。它有一个名称,以及可选的别名。
Encoding::US_ASCII.name # => "US-ASCII" Encoding::US_ASCII.names # => ["US-ASCII", "ASCII", "ANSI_X3.4-1968", "646"]
接受编码作为参数的 Ruby 方法将接受:
-
一个 Encoding 对象。
-
一个编码的名称。
-
一个编码名称的别名。
这些是等效的
'foo'.encode(Encoding::US_ASCII) # Encoding object. 'foo'.encode('US-ASCII') # Encoding name. 'foo'.encode('ASCII') # Encoding alias.
关于编码及其用法的全面讨论,请参阅 编码文档。
Encoding::ASCII_8BIT 是一种特殊用途的编码,通常用于字节字符串,而不是字符字符串。但是,正如名称所示,其 ASCII 范围内的字符被视为 ASCII 字符。当您使用其他 ASCII 兼容的编码时,这很有用。
公共类方法
源码
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];
}
返回可用编码别名和原始编码名称的哈希。
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
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);
}
检查两个对象的兼容性。
如果两个对象都是字符串,则它们在可以连接时兼容。如果它们兼容,则返回连接后的字符串的编码;如果不兼容,则返回 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
get_default_external(VALUE klass)
{
return rb_enc_default_external();
}
返回默认的外部编码。
默认情况下,从以下位置创建的字符串使用默认的外部编码:
-
CSV
-
File从磁盘读取的数据 -
SDBM
虽然从这些位置创建的字符串将具有此编码,但该编码可能无效。请务必检查 String#valid_encoding?。
当写入磁盘时,File 数据将被转码为默认的外部编码,如果 default_internal 不为 nil。
默认的外部编码由 -E 选项初始化。如果未设置 -E,则在 Windows 上将其初始化为 UTF-8,在其他操作系统上将其初始化为区域设置。
源码
static VALUE
set_default_external(VALUE klass, VALUE encoding)
{
rb_warning("setting Encoding.default_external");
rb_enc_set_default_external(encoding);
return encoding;
}
设置默认的外部编码。您不应在 ruby 代码中设置 Encoding::default_external,因为在更改值之前创建的字符串可能与更改值之后创建的字符串具有不同的编码。相反,您应该使用 ruby -E 来调用 ruby 并使用正确的 default_external。
有关如何使用默认外部编码的信息,请参阅 Encoding::default_external。
源码
static VALUE
get_default_internal(VALUE klass)
{
return rb_enc_default_internal();
}
返回默认的内部编码。如果默认的内部编码不为 nil,则在以下位置的字符串将被转码为默认的内部编码:
此外,如果没有给出编码,则 String#encode 和 String#encode! 使用默认的内部编码。
脚本编码 (__ENCODING__),而不是 default_internal,用作创建字符串的编码。
Encoding::default_internal 通过 -E 选项初始化,否则为 nil。
源码
static VALUE
set_default_internal(VALUE klass, VALUE encoding)
{
rb_warning("setting Encoding.default_internal");
rb_enc_set_default_internal(encoding);
return encoding;
}
设置默认的内部编码,或者在传递 nil 时删除默认的内部编码。您不应在 ruby 代码中设置 Encoding::default_internal,因为在更改值之前创建的字符串可能与更改之后创建的字符串具有不同的编码。相反,您应该使用 ruby -E 来调用 ruby 并使用正确的 default_internal。
有关如何使用默认内部编码的信息,请参阅 Encoding::default_internal。
源码
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);
}
使用指定的名称搜索编码。name 应该是一个字符串。
Encoding.find("US-ASCII") #=> #<Encoding:US-ASCII>
此方法接受的名称是编码名称和别名,包括以下特殊别名:
- “external”
-
默认的外部编码
- “internal”
-
默认的内部编码
- “locale”
-
区域设置编码
- “filesystem”
-
文件系统编码
当没有具有name 的编码时,会引发 ArgumentError。但是,只有 Encoding.find("internal") 在没有名为“internal”的编码时返回 nil,换句话说,当 Ruby 没有默认的内部编码时。
源码
static VALUE
enc_list(VALUE klass)
{
VALUE ary = rb_ary_new2(0);
rb_ary_replace(ary, rb_encoding_list);
return ary;
}
返回已加载编码的列表。
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)>]
源码
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
}
返回区域设置字符映射名称。如果没有适当的信息,则返回 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”)。
源码
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;
}
返回可用编码名称的列表。
Encoding.name_list
#=> ["US-ASCII", "ASCII-8BIT", "UTF-8",
"ISO-8859-1", "Shift_JIS", "EUC-JP",
"Windows-31J",
"BINARY", "CP932", "eucJP"]
公共实例方法
源码
static VALUE
enc_ascii_compatible_p(VALUE enc)
{
return RBOOL(rb_enc_asciicompat(must_encoding(enc)));
}
返回是否与 ASCII 兼容。
Encoding::UTF_8.ascii_compatible? #=> true Encoding::UTF_16BE.ascii_compatible? #=> false
源码
static VALUE
enc_dummy_p(VALUE enc)
{
return RBOOL(ENC_DUMMY_P(must_encoding(enc)));
}
对于虚拟编码返回 true。虚拟编码是一种没有正确实现字符处理的编码。它用于有状态编码。
Encoding::ISO_2022_JP.dummy? #=> true Encoding::UTF_8.dummy? #=> false
源码
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_inspect_name(enc),
(ENC_DUMMY_P(enc) ? " (dummy)" : ""),
rb_enc_autoload_p(enc) ? " (autoload)" : "");
}
返回表示程序员的编码的字符串。
Encoding::UTF_8.inspect #=> "#<Encoding:UTF-8>" Encoding::ISO_2022_JP.inspect #=> "#<Encoding:ISO-2022-JP (dummy)>"
源码
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::WINDOWS_31J.names #=> ["Windows-31J", "CP932", "csWindows31J", "SJIS", "PCK"]
源码
static VALUE
enc_name(VALUE self)
{
return rb_fstring_cstr(rb_enc_name((rb_encoding*)DATA_PTR(self)));
}
返回编码的名称。
Encoding::UTF_8.name #=> "UTF-8"