Encoding::BINARY 和 Encoding::ASCII-8BIT 的区别?

Jar*_*eck 5 ruby encoding

Ruby 说的Encoding::BINARYEncoding::ASCII-8BIT是一样的。

Encoding::BINARY == Encoding::ASCII_8BIT
#=> true
Run Code Online (Sandbox Code Playgroud)

我们显式地创建了一个二进制字符串,而 ruby​​ 仍然说它是ASCII_8BIT.

String.new("ABC", encoding: Encoding::BINARY).encoding
#=> #<Encoding:ASCII-8BIT>
Run Code Online (Sandbox Code Playgroud)

同样,force_encoding不能创建 a BINARY,它只会创建一个ASCII-8BIT字符串。

似乎这BINARY只是 的别名ASCII-8BIT。有什么区别吗?

cre*_*mno 5

您的观察是正确的:BINARY并且ASCII-8BIT确实是别名,作为别名意味着没有区别,因为它只是相同编码、方法等的另一个名称。

查看源代码是确认这一点的最可靠方法。CRuby 的字符编码可以在enc目录中找到。的ASCII-8BIT编码中定义ascii.c包含以下行的文件(在2.5.0,它的线61):

ENC_ALIAS("BINARY", "ASCII-8BIT")
Run Code Online (Sandbox Code Playgroud)

ENC_ALIAS就像 Ruby 的alias关键字(别名、原始名称)一样工作。

确认BINARY或另一个编码名称是别名也可以在纯 Ruby 中完成。一种可能性是调用Encoding.aliases返回散列的方法(别名 => 原始):

Encoding.aliases['BINARY']  # => "ASCII-8BIT"
Run Code Online (Sandbox Code Playgroud)

其他有用的方法是Encoding#name返回原始名称并Encoding#names返回所有别名:

Encoding::BINARY.names    # => ["ASCII-8BIT", "BINARY"]
Encoding::US_ASCII.names  # => ["US-ASCII", "ASCII", "ANSI_X3.4-1968", "646"]
Run Code Online (Sandbox Code Playgroud)

或者没有任何Encoding方法的方法:

Encoding::BINARY.equal?(Encoding::ASCII_8BIT)
Run Code Online (Sandbox Code Playgroud)

由于该==方法经常被覆盖并且true即使两个操作数是两个不同的对象也可能返回,因此BasicObject#equal?应调用以检查它们是否为同一对象。例如11.0具有相同的值(==返回true)但不具有相同的对象标识(equal?返回false)。