2

libxmlで読んでいるxmlノードに次の属性があります。reader.nodeを印刷すると、アクセント付きの文字で正常に印刷されます。

reader = XML::Reader.new(File.open("somefile.xml", "r"))
reader.read
reader.read
...
p reader.node

=> ... Full_Name="Univisión Network - East Feed" ...

でもこれをやると逃げて出てきます。

p reader.node["Full_Name"]
=> "Univisi\xC3\xB3n Network - East Feed"

そして、この値をjson laaterに変換しようとすると、次のエラーが発生します。

Encoding::UndefinedConversionError: "\xC3" from ASCII-8BIT to UTF-8

これがドキュメントのxml行です

<?xml version="1.0" encoding="ISO-8859-1"?>

xmlドキュメント自体を制御することはできません。そのユニコード文字をjsonに戻す、またはjsonが理解できる形式に戻すにはどうすればよいですか?

編集:ああ、私は言及するのを忘れました-これは実際のXMLドキュメントでどのように見えるかです

Full_Name="Univisi&#243;n Network - East Feed" 
4

3 に答える 3

1

そのため、「正しい」方法を理解できなかった理由についてはまだ完全に迷っていますが、このスレッドforce_encodingはStringクラスのメソッドを見つけるのに役立ちました。force_encoding私のコードはとにかく属性をハッシュにコピーすることを含んでいるので、値をコピーするときに 呼び出すことは大したことではありません。

ファイルをUTF-8として保存したことを二重に確認し、正しいxml宣言を一番上に配置しました。それでも失敗しました。

とにかく、私が実際の問題を修正する方法を理解できるまで、このコードはそれを修正しました。

  object = { type: node.name }      
  node.attributes.each do |attribute|
    name = attribute.name.gsub /_/,""
    value = attribute.value.force_encoding('UTF-8')

    object[name] = value
  end

ノードをハッシュにコピーする必要がない場合、これは適切ではないことに注意してください。これは、すべてのトラブルに見合うだけの価値がないためです。私がそうしたら

object.to_json

問題なく動作します。すべてのあなたの助けの斧をありがとう!xmlでエンコードを強制する方法を知っていますか?

于 2010-01-27T22:38:40.587 に答える
0

しかし、これを行うと、逃げて出てきます。

完全ではありません。表示されているのは、バイトの文字列として解釈されるUTF-8出力です。

問題は、XMLドキュメントにISO-8859-1と記載されているのに対し、実際にはUTF-8であるということです。エンコーディングの問題を修正すると、機能するはずです。

于 2010-01-27T17:15:05.197 に答える
0

編集
して、私はこれをかなり長い間理解しようとしてきました。面白いことに、あなたのコードはruby 1.8でエラーなしで動作します(少なくともここでは)。したがって、エラーはruby1.9の新しいエンコーディング処理に関係していると思います。どういうわけか、解析されて読み取られたXMLが(libxmlの内部)utf-8形式であることを理解できません(ドキュメントのエンコードはここでは重要ではありません:1.8では、iso-8859-1とutf-8の両方で動作します。間違ったxmlエンコーディング宣言)。代わりに、ASCII-8BITまたはBINARYとして扱います。言い換えれば、それはエンコーディングを知りません。to_jsonこれが、 utf-8への変換に失敗する理由です。

それを解決する最も簡単な方法は、ruby1.8にダウングレードすることかもしれません。

あるいは、のアプローチはforce_encoding('UTF-8')合理的であるように思われます。
編集終了

適切なエンコーディングをリーダーに渡してみることができます。

reader = XML::Reader.new(File.open("somefile.xml", "r"), 
  XML::Encoding::ISO_8859_1)
于 2010-01-27T17:17:05.473 に答える