我最近开始在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>
编码差异的原因是什么?
答案 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)