2012-02-03 77 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