类编码

编码实例表示 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.

有关编码及其用途的完整讨论,请参阅编码文档

Encoding::ASCII_8BIT 是一种特殊用途的编码,通常用于字节字符串,而不是字符字符串。但顾名思义,其 ASCII 范围内的字符被视为 ASCII 字符。当您使用其他 ASCII 兼容编码时,这很有用。

公共类方法

aliases -> {"alias1" => "orig1", "alias2" → "orig2", ...} 单击以切换源

返回可用编码别名和原始编码名称的哈希。

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];
}
compatible?(obj1, obj2) → enc or nil 单击以切换源

检查两个对象的兼容性。

如果对象都是字符串,则当它们可以连接时,它们是兼容的。如果它们兼容,则返回连接字符串的编码,如果不兼容,则返回 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);
}
default_external → enc 单击以切换源

返回默认外部编码。

默认外部编码在从以下位置创建的字符串中默认使用

虽然从这些位置创建的字符串将具有此编码,但编码可能无效。务必检查 String#valid_encoding?

写入磁盘的 File 数据将在写入时转码为默认外部编码,如果 default_internal 不为 nil。

默认外部编码由 -E 选项初始化。如果未设置 -E,则在 Windows 上初始化为 UTF-8,在其他操作系统上初始化为区域设置。

static VALUE
get_default_external(VALUE klass)
{
    return rb_enc_default_external();
}
default_external = enc 单击以切换源

设置默认外部编码。您不应在 Ruby 代码中设置 Encoding::default_external,因为在更改值之前创建的字符串可能与在更改值之后创建的字符串具有不同的编码,而应使用 ruby -E 以正确的 default_external 调用 Ruby。

有关如何使用默认外部编码的信息,请参见 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;
}
default_internal → enc 单击以切换源

返回默认内部编码。如果默认内部编码不为 nil,则字符串将在以下位置转码为默认内部编码

此外,如果未给出编码,String#encodeString#encode! 将使用默认内部编码。

脚本编码 (__ENCODING__),而不是 default_internal,用作创建的字符串的编码。

Encoding::default_internal 使用 -E 选项初始化,否则为 nil。

static VALUE
get_default_internal(VALUE klass)
{
    return rb_enc_default_internal();
}
default_internal = enc 或 nil 单击以切换源

设置默认内部编码或在传递 nil 时移除默认内部编码。您不应该在 Ruby 代码中设置 Encoding::default_internal,因为在更改值之前创建的字符串可能与更改之后创建的字符串具有不同的编码。相反,您应该使用 ruby -E 以正确的 default_internal 调用 Ruby。

有关如何使用默认内部编码的信息,请参见 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;
}
find(string) → enc 单击以切换源

使用指定 name 搜索编码。name 应为字符串。

Encoding.find("US-ASCII")  #=> #<Encoding:US-ASCII>

此方法接受的名称是编码名称和别名,包括以下特殊别名

“external”

默认外部编码

“internal”

默认内部编码

“locale”

区域设置编码

“filesystem”

文件系统编码

当没有 name 编码时,将引发 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);
}
list → [enc1, enc2, ...] 单击以切换源

返回已加载编码的列表。

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;
}
locale_charmap → string 单击以切换源

返回区域设置字符映射名称。如果没有适当的信息,则返回 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
}
name_list → ["enc1", "enc2", ...] 单击以切换源

返回可用编码名称的列表。

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_compatible? → true 或 false 单击以切换源

返回是否兼容 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)));
}
dummy? → true 或 false 单击以切换源

对于虚拟编码,返回 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)));
}
inspect → string 单击以切换源

返回表示编码的字符串,供程序员使用。

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)" : "");
}
name → string

返回编码的名称。

Encoding::UTF_8.name      #=> "UTF-8"
别名:to_s
names → array 单击以切换源

返回编码的名称和别名的列表。

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];
}
to_s → string 单击以切换源

返回编码的名称。

Encoding::UTF_8.name      #=> "UTF-8"
static VALUE
enc_name(VALUE self)
{
    return rb_fstring_cstr(rb_enc_name((rb_encoding*)DATA_PTR(self)));
}
别名:name