我最近开始使用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>
编码差异的原因是什么?
好发现!
简短的答案是,它是完全任意的,并且取决于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
方法,因此为了使其具有泛型信息性,他们对其进行了编码以输出对象的内部指针的值。最简单的方法是使用和说明符。但是,无论谁对Ruby的包装器进行了编码,都变得懒惰,只是将编码设置为。因此,通常所有返回格式化字符串的内容都将具有以下编码:sprintf
%p
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。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句