2

たぶんあなたは私が持っているYamlエンコーディングを手伝うことができます。

データベースにシリアル化されたいくつかの設定をYaml文字列として保存するアプリケーションがあります。次に例を示します。

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

現在、Ruby1.8.7からRuby1.9.3に移行中です。バージョン間で、Yaml解析ライブラリが変更され、fromStückから。のようなデコードされた文字列が残りStückます。

これらの文字列をUnicodeに適切に変換する方法を知りたいだけで、残りは自分で処理します。

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

4

2 に答える 2

4

これは utf8 が iso-8895-1 として読み取られ、ruby アダプターによって 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"
于 2012-04-23T10:24:26.630 に答える
-1

ありがとう@Tass、私はあなたのような奇妙な方法を書いています。

Rails 3.2およびRuby 1.9とMysqlデータベースを共有するRuby 1.8のRails 2.3にアプリケーションがあります

Rails 2.2 でシリアル化された配列を保存すると、mysql で "binary!" が表示されることがあります。または文字列の形式が間違っているため、Rails 3.2 でテキストを表示すると、奇妙な動作が発生しました。

この問題を処理する方法を書きました (Rails 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
于 2013-05-07T15:04:56.230 に答える