Ruby说Encoding::BINARY
和Encoding::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
的别名。有什么不同吗?
答案 0 :(得分:2)
是的,BINARY
和ASCII-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?
来检查它们是否是同一个对象。例如。 1
和1.0
具有相同的值(==
返回true
),但不是相同的对象标识(equal?
返回false
)。