1

良い一日、

解析する必要がある大きな xml ファイルがたくさんありますが、問題はそれらに 'gb2312' エンコーディングがあることです。通常、これには SAX パーサーを使用します。

xml の例を次に示します。

<?xml version="1.0" encoding="gb2312"?>
<Root>
<ValueList Count="112290" FieldCount="11">
  <Item1 Value1="23743" Value2="Дипломатия � Пустой кувшин" Value3="1" Value4="" Value5="6"   Value6="0" Value7="0" Value8="0" Value9="0" Value10="0" Value11="0"/>
  <Item2 Value1="6611" Value2="ДЛ � 018 омела � золотой кинжал" Value3="1" Value4="" Value5="6" Value6="0" Value7="0" Value8="0" Value9="0" Value10="0" Value11="0"/>
  <Item3 Value1="6608" Value2="Наука (ДЛ)�круг фей 021�тяпка" Value3="1" Value4="" Value5="6" Value6="0" Value7="0" Value8="0" Value9="0" Value10="0" Value11="0"/>
  <Item4 Value1="6612" Value2="Знаки ДЛ � 003руны � разрушение" Value3="1" Value4="" Value5="6" Value6="0" Value7="0" Value8="0" Value9="0" Value10="0" Value11="0"/>
....
</Root>

私は Nokogiri SAX を使用しようとしています (同じ結果で libxml-ruby も試しました) パーサー:

require 'nokogiri'

class SchemaParser < Nokogiri::XML::SAX::Document
  def initialize
    @cnt = 0
  end
  def start_element name, attrs =[]
    if name == "Item1"
      @cnt+= 1
      puts @cnt
    end
  end
end

parser = Nokogiri::XML::SAX::Parser.new(SchemaParser.new)
parser.parse_io(File.open('2_4_EQUIPMENT_ESSENCE.xml'), 'gb2312')

しかし、これにより、「`check_encoding': 'GB2312' は有効なエンコーディングではありません (ArgumentError)」というエラーが発生します。エンコーディング宣言を削除して Nokogiri にエンコーディングを検出させると、次のエラーが表示されます。

encoding error : input conversion failed due to input error, bytes 0xA8 0x43 0x20 0xA7
encoding error : input conversion failed due to input error, bytes 0xA8 0x43 0x20 0xA7
I/O error : encoder error  

また、適切なエンコーディングでファイルを開こうとしましたが、SAX パーサーの助けにはなりませんでした:

[3] pry(main)> f = File.open('2_4_EQUIPMENT_ESSENCE.xml', "r:gb2312")
=> #<File:2_4_EQUIPMENT_ESSENCE.xml>
[4] pry(main)> f.external_encoding.name
=> "GB2312"

RubyのSAXパーサーで「gb2312」エンコーディングを使用した人はいますか? 続行する方法について何か推奨事項はありますか?

4

2 に答える 2

0

だから、ここに私の回避策があります。

問題:

  1. xml に表示される文字の一部は「gb2312」エンコーディングではありません。完全な漢字では「GB18030」の方が適していることがわかりました。
  2. すべての xml を utf8 に変換したので、SAX パーサーを使用できます。

私はこのレーキタスクで終わった:

desc "convert chinese xml files to utf-8"
task :convert do
  rm_rf 'data/utf8'
  mkdir 'data/utf8'
  Dir.foreach('data') {|f|
    if f.end_with?('.xml')
      puts "converted:: data/utf8/#{f}" if system("iconv -f GB18030 -t UTF-8 data/#{f} > data/utf8/#{f}")
    end
  }
  #replace encodings for xml files
  system("bundle exec ruby -pi -e \"gsub(/gb2312/, 'UTF-8')\" data/utf8/*.xml")
end
于 2014-01-26T16:21:39.147 に答える
0

問題は、Libxml2 が GB2312 エンコーディングをサポートしていないことにあるようです (サポートされているエンコーディングのリストについては、こちらを参照してください)。

これを試したかどうかはわかりませんが、XML ファイルからエンコーディング宣言を削除して (Libxml2 がデータをトランスコードしようとしないように)、File オブジェクトの外部エンコーディングを GB2312 に設定することで、これを回避できると思います。これは、Ruby がファイルを読み取るときにファイルを UTF-8 にトランスコードし、それ以降はすべてが UTF-8 のままになるためです。

于 2013-09-22T23:56:28.183 に答える