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

时间:2018-01-15 01:00:27

标签: ruby encoding

Ruby说Encoding::BINARYEncoding::ASCII-8BIT是相同的。

Encoding::BINARY == Encoding::ASCII_8BIT
#=> true

我们明确地创建了一个二进制字符串,ruby仍然说它是ASCII_8BIT

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

同样,force_encoding无法创建BINARY,只会创建一个ASCII-8BIT字符串。

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

1 个答案:

答案 0 :(得分:2)

是的,BINARYASCII-8BIT确实是别名,并且作为别名意味着没有差异,因为它只是相同编码,方法等的另一个名称。

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

ENC_ALIAS("BINARY", "ASCII-8BIT")

ENC_ALIAS的作用类似于Ruby的alias关键字(别名,原始名称)。

确认BINARY或其他编码名称是别名也可以在纯Ruby中完成。一种可能是调用返回哈希值的Encoding.aliases方法(别名=&gt;原始):

Encoding.aliases['BINARY']  # => "ASCII-8BIT"

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

Encoding::BINARY.names    # => ["ASCII-8BIT", "BINARY"]
Encoding::US_ASCII.names  # => ["US-ASCII", "ASCII", "ANSI_X3.4-1968", "646"]

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

Encoding::BINARY.equal?(Encoding::ASCII_8BIT)

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