Updated: 2002-12-06 01:25:03 - [ Home | Wiki Home | Index | Changes ]
InputSourceのコンストラクタの引数によって、エンコーディングの取得方法が変わります。
ソースを見ると InputSource には何の機能も無いことがわかります。変数を保持し、アクセスを提供するだけです。一方で、InputSourceに何が設定されているかによって、SAXパーサの動作が変わります(少なくともXercesとCrimsonは変わるようです)。
特にXMLファイルのエンコーディングがどうやって決まるかは、重要なポイントだと思います。
InputSourceのコンストラクタの引数によって、つぎのようにSAXパーサの動作が変わります。
まとめると、
| 構築 | エンコーディング | 使用回数 |
| Reader | Readerに依存 | 使い捨て |
| I nputStream | XML宣言から取得 | 使い捨て |
| SystemID | XML宣言から取得 | 再利用可 |
です。
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の場合のみ文字化けします。
以下が参考になります。ありがとうございます。