2012-04-23 44 views
2

也許你可以幫助我使用Yaml編碼。從1.8.7升級Ruby到1.9.3後Yaml編碼問題

我們有存儲在數據庫中的字符串YAML序列化的一些設置,例如應用程序:

--- 
quantity_units: Stunden,Tage, Monate, Pauschal, Jahre, GB, MB, Stück, Seite, SMS 
categories: Shirts 
number_schema: P-[Y4]-[CY3] 

我們是從紅寶石1.8.7移動到Ruby 1.9.3的一個過程, Yaml解析庫在版本之間發生了變化,給我們留下了這樣的解碼字符串,從StückStück

我只想知道如何正確地將這些字符串轉換爲unicode,然後我會照顧其餘的。

我不知道在1.8.7 Yaml解析器中使用哪種編碼。

+0

你使用哪種編碼來讀取YAML文件?紅寶石中的「Stück」字符串有哪些編碼? – Reactormonk 2012-04-23 10:12:24

+0

默認UTF-8 ruby​​ 1.9.3編碼; '>「Stück」.encoding#=>#<編碼:UTF-8>' – Mike 2012-04-23 10:15:11

回答

4

這看起來像utf8讀爲iso-8895-1,並被解釋爲utf-8的 ruby​​適配器。您可能想要檢查當前的區域設置和數據庫服務器的區域設置。另請參閱如果通過控制檯直接訪問 數據會發生什麼情況,並檢查編碼。它在數據庫上看起來像utf-8,但在其間的某處被解釋爲iso-8859-1 。

如果沒有什麼幫助,有一個片段可以傳遞你的數據(和 寫回)。

"Stück".encode('iso-8859-1').force_encoding('utf-8') # I've no idea what I'm doing. 
# => "Stück" 
-1

謝謝@Tass,我寫了一個奇怪的方法,比如你的「#我不知道我在做什麼。」

我對下紅寶石1.8軌2.3共享與導軌3.2 MySQL數據庫和Ruby 1.9

on Rails的2.2 當我保存一個序列化的陣列,有時我可以在MySQL中看到的應用程序「二進制」!或我的字符串格式錯誤,所以,當我用rails 3.2顯示文本時,我得到了奇怪的行爲。

我寫來處理這個問題的方法(我希望我們將遷移軌2.3):

def self.decode(words) 
    temp_name = words || '' 
    temp_name_encoding = temp_name.encoding 

    if temp_name_encoding == Encoding::ASCII_8BIT 
    return temp_name.encode('ASCII-8BIT').force_encoding('utf-8') 
    elsif temp_name_encoding == Encoding::UTF_8 
    return temp_name.encode('iso-8859-1').force_encoding('utf-8') 
    else 
    return temp_name 
    end 
rescue Encoding::UndefinedConversionError 
    temp_name 
end 
相關問題