首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Encoding::BINARY和Encoding::ASCII-8BIT?

Encoding::BINARY和Encoding::ASCII-8BIT?
EN

Stack Overflow用户
提问于 2018-01-15 09:00:27
回答 1查看 946关注 0票数 5

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

代码语言:javascript
复制
Encoding::BINARY == Encoding::ASCII_8BIT
#=> true

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

代码语言:javascript
复制
String.new("ABC", encoding: Encoding::BINARY).encoding
#=> #<Encoding:ASCII-8BIT>

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

看起来BINARY仅仅是ASCII-8BIT的别名。有什么不同吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-15 14:48:10

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

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

代码语言:javascript
复制
ENC_ALIAS("BINARY", "ASCII-8BIT")

ENC_ALIAS的工作原理类似于Ruby的alias关键字(别名,原名)。

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

代码语言:javascript
复制
Encoding.aliases['BINARY']  # => "ASCII-8BIT"

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

代码语言:javascript
复制
Encoding::BINARY.names    # => ["ASCII-8BIT", "BINARY"]
Encoding::US_ASCII.names  # => ["US-ASCII", "ASCII", "ANSI_X3.4-1968", "646"]

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

代码语言:javascript
复制
Encoding::BINARY.equal?(Encoding::ASCII_8BIT)

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48255737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档