2012-04-23 15 views
2

私が持っているYamlエンコーディングを助けることができます。Rubyを1.8.7から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] 

我々は、Ruby 1.9.3へのRuby 1.8.7から移動する過程であり、そしてYamlの解析ライブラリがバージョン間で変更され、StückからStückまでのようなデコードされた文字列が残っています。

私は、これらの文字列をどのようにしてUnicodeに変換できるのか知りたいだけです。残りの部分は私が処理します。

1.8.7 Yamlパーサーでどのエンコードが使用されているのかわかりません。

+0

どのエンコーディングあなたはYAMLファイルを読み取るために使用しましたか?そして、Rubyで 'Stück'文字列にはどのエンコードがありますか? – Reactormonk

+0

デフォルトのUTF-8ルビ1.9.3エンコーディング。 '>"Stück ".encoding#=>#<エンコーディング:UTF-8>' – Mike

答えて

4

これは、utf8がiso-8895-1として読み込まれ、 によってutf-8と解釈されます。現在のロケールと、データベースサーバーのロケール を確認したい場合があります。また、コンソールから直接 のデータにアクセスしてエンコードをチェックするとどうなりますか。それは はデータベース上で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

ありがとうございました@タス、私はあなたのような奇妙な方法を書いています。私は何をしているのか分かりません。

私はレール3.2とMySQLデータベースを共有し、私はシリアル化された配列を保存すると、時々私は、MySQLで見ることができます2.2 on Railsの1.9

ルビールビー1.8の下レール2.3でアプリケーション持っている「バイナリを!」または私の文字列が間違った形式で書かれているので、私がレールでテキストを表示すると、私は奇妙な動作をします。

私は(私たちはレール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 
関連する問題