Ruby中的字符串编码

加里戈特山羊

我最近开始使用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%psprintfrb_sprintfNULLASCII-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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章