41

Encoding::UndefinedConversionError - "\xC2" from ASCII-8BIT to UTF-8ハッシュをJSON文字列に変換しようとするたびに取得し続けます。[.encode | .force_encoding](["UTF-8" | "ASCII-8BIT" ])、チェーン.encode.force_encodingバックワード、パラメーターの切り替えを試してみましたが、何も機能していないようだったので、次のようなエラーが発生しました。

begin
  menu.to_json
rescue Encoding::UndefinedConversionError
  puts $!.error_char.dump
  p $!.error_char.encoding
end

menuは、MySQL DBからのコンテンツを含む続編のdataset.to_hashであり、utf8_general_ciエンコーディングであり、これを返します。

"\ xC2"

<#Encoding:ASCII-8BIT>

何を使用しても、エンコーディングは変更されませ.encode.force_encoding.gsub!(/\\\xC2/)運が悪かったので、弦を交換しようとさえしました。

何か案は?

4

5 に答える 5

21

「\xC2」に何を期待しますか? おそらくÂ

ASCII-8BIT を使用すると、バイナリ データが得られ、Ruby は何をすべきかを判断できません。

最初に でエンコーディングを設定する必要がありforce_encodingます。

次のコードを試すことができます。

Encoding.list.each{|enc|
  begin
    print "%-10s\t" % [enc]
    print "\t\xC2".force_encoding(enc)
    print "\t\xC2".force_encoding(enc).encode('utf-8')
  rescue => err
    print "\t#{err}"
  end
  print "\n"
}

結果は、「\xC2」のさまざまなエンコーディングで可能な値です。

結果は出力形式に依存する場合がありますが、どのエンコーディングを使用しているかを推測できると思います。

必要なエンコーディング (おそらく cp1251) を定義すると、次のことができます。

menu.force_encoding('cp1252').to_json

Kashyaps のコメントも参照してください。

于 2012-10-22T09:31:33.777 に答える
12

奇妙なキャラクターを失うことを気にしない場合は、吹き飛ばすことができます。

str.force_encoding("ASCII-8BIT").encode('UTF-8', undef: :replace, replace: '')
于 2012-12-30T21:11:20.960 に答える
10

自動承認されたソリューションは機能しません。事実上エラーはありませんが、JSON ではありません。

私は oj gem を使用して問題を解決しました。また、標準の JSON ライブラリよりも高速です。

書く:

   menu_json = Oj.dump menu

読む :

   menu2 = Oj.load menu_json

詳細については、 https://github.com/ohler55/ojを参照してください。それが役立つことを願っています。

于 2013-09-20T15:47:57.430 に答える