2012-02-03 50 views
2

我有一个字符串键一个简单的常量定义哈希:哈希串获得的编码错误

MY_CONSTANT_HASH = { 
'key1' => 'value1' 
} 

现在,我已经注意到,encoding.name的关键是US-ASCII。但是,Encoding.default_internal事先设定为UTF-8。为什么它没有正确编码?我不能force_encoding后来,因为该对象在这一点上冻结,所以我得到这个错误:

can't modify frozen String

PS:我使用的红宝石1.9.3p0(2011-10-30修订33570) 。

回答

2

默认internalexternal编码旨在IO操作:

  • CSV从磁盘读取
  • 文件数据
  • 文件名从迪尔
  • 等...

要做的最简单的事情就是添加# encoding=utf-8评论以告诉Ruby如此urce文件是UTF-8编码的。例如,如果您运行此:

# encoding=utf-8 
H = { 'this' => 'that' } 
puts H.keys.first.encoding 

作为一个独立的Ruby脚本,你会得到UTF-8,你要是跑不过这样的:

H = { 'this' => 'that' } 
puts H.keys.first.encoding 

,你可能会得到US- ASCII。

+0

这是设置内联字符串编码的官方方式吗?此外,在该链接下,您可以阅读以下内容:“区域设置编码(__ ENCODING __),而不是default_internal,用作所创建字符串的编码。” – m33lky 2012-02-03 22:29:07

+0

@ m33lky:我认为这个“魔法评论”破解的效果与官方一样,还有其他一些变化。取决于语言环境设置的唯一问题是它们在应用程序或源文件外部,因此如果您更改语言环境,使用其他计算机工作,忘记在服务器上设置语言环境,则可能会出现奇怪的非本地效果,... – 2012-02-03 22:41:01