Ruby中的字符串编码

时间:2015-11-14 02:09:27

标签: ruby encoding

我最近开始在Ruby中使用编码,并且对某些行为感到困惑。

我正在使用2.2.3p173并显示以下内容:

__ENCODING__             #=> #<Encoding:UTF-8>  Default encoding in 2.2.3

"my_string".encoding     #=> #<Encoding:UTF-8>
Object.to_s.encoding     #=> #<Encoding:US-ASCII>
Object.new.to_s.encoding #=> #<Encoding:ASCII-8BIT>

编码差异的原因是什么?

2 个答案:

答案 0 :(得分:4)

很好找!

简短的回答是它是完全随意的,它取决于Ruby如何在内部构建返回的字符串。

有许多内部C函数使用US-ASCII编码构造空字符串或文字字符串:rb_usascii_str_new等。它们经常用于通过附加较小的字符串片段来构造字符串。几乎每个to_s方法都会这样做:

[].to_s.encoding
#<Encoding:US-ASCII>
{}.to_s.encoding
#<Encoding:US-ASCII>
$/.to_s.encoding
#<Encoding:US-ASCII>
1.to_s.encoding
#<Encoding:US-ASCII>
true.to_s.encoding
#<Encoding:US-ASCII>
Object.to_s.encoding
#<Encoding:US-ASCII>

那为什么不Object.new.to_s?这里的关键是Object#to_s每个类的后备to_s方法,所以为了使它具有通用性而又提供信息,他们将其编码为输出值对象的内部指针。最简单的方法是使用sprintf%p说明符。 无论是谁编写了Ruby的sprintf包装器rb_sprintf,它都会变得懒惰,只需将编码设置为NULL即可回退到ASCII-8BIT。因此,通常返回格式化字符串的任何内容都将具有以下编码:

Object.new.to_s
#<Encoding:ASCII-8BIT>
nil.sort rescue $!.to_s.encoding
#<Encoding:ASCII-8BIT>
[].each.to_s.encoding
#<Encoding:ASCII-8BIT>

对于脚本定义的字符串,它们会像您期望的那样获得默认的UTF-8编码。

答案 1 :(得分:1)

{p> ObjectC中定义 如果您尝试以下方法:

String(123456).encoding #=> #<Encoding:ASCII-8BIT>
"123456".encoding       #=> #<Encoding:UTF-8>

我没有在ruby源代码中挖掘太多内容,但looks喜欢对rb_usascii_str_new2

的编码(to_s)进行编码