Input Source Encoding

Updated: 2002-12-06 01:25:03 - [ Home | Wiki Home | Index | Changes ]

InputSourceのコンストラクタの引数によって、エンコーディングの取得方法が変わります。

目次

org.xml.sax.InputSourceについて
動作の違い
テスト
参考

org.xml.sax.InputSourceについて

ソースを見ると InputSource には何の機能も無いことがわかります。変数を保持し、アクセスを提供するだけです。一方で、InputSourceに何が設定されているかによって、SAXパーサの動作が変わります(少なくともXercesとCrimsonは変わるようです)。

特にXMLファイルのエンコーディングがどうやって決まるかは、重要なポイントだと思います。

動作の違い

InputSourceのコンストラクタの引数によって、つぎのようにSAXパーサの動作が変わります。

まとめると、

構築エンコーディング使用回数
ReaderReaderに依存使い捨て
I nputStreamXML宣言から取得使い捨て
SystemIDXML宣言から取得再利用可

です。

XML宣言からエンコーディングを取得する処理は、Crimsonだとorg.apache.crimson.parser.XmlReaderで行っているようです。Xerces(2.0b3)ではorg.apache.xerces.impl.XMLScannerで取得してXMLDocumentFragmentScannerImplで設定してるみたいでした。

テスト

以下のコードを使って実験しました。

LANGがja_JP.SJISの環境(Windows2000)で、EUCで書かれたtest.xmlを以下のようにしてパースしました。

$ java InputSouceEncodingTest s test.xml
$ java InputSouceEncodingTest r test.xml
$ java InputSouceEncodingTest i test.xml

sはInputStream、rはReader、iはSystemIDを使ってInputSourceを構築します。rの場合のみ文字化けします。

参考

以下が参考になります。ありがとうございます。



KOSEKI Kengo <kengo@tt.rim.or.jp>