Ruby 说的Encoding::BINARY和Encoding::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。有什么区别吗?
您的观察是正确的: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?应调用以检查它们是否为同一对象。例如1,1.0具有相同的值(==返回true)但不具有相同的对象标识(equal?返回false)。
| 归档时间: |
|
| 查看次数: |
937 次 |
| 最近记录: |