- - PR -
XMLパーサ(Xerces)で全角マイナスが文字化け
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-01-19 13:58
いつも拝見させていただいています。
Xercesを使用したParseで問題が発生していまして、 投稿しました。 Shift_JISで作成されたXMLファイル内で、 値に日本語を設定しparse()すると、 全角マイナスが欧文字の("-")に文字化けしてしまいます。 (※半角マイナスとも違います。) -------------- import org.apache.xerces.parsers.DOMParser; : DOMParser parser = new DOMParser(); parser.parse(new InputSource(new FileInputStream("C:\\test.xml"))); Document doc = parser.getDocument(); -------------- docのノードリスト内には他の日本語は問題ないのですが、 全角ハイフンのみ欧文字の("-")※半角マイナスとも違います。 となってしまいます。 InputSourceに対してsetEncoding("Shift_JIS")等行ってみましたが 結果は得られませんでした。 Xercesのページで対応言語等も確認しています。 なにか設定が不足していたり/誤っているのでしょうか。 XML内には <?xml version="1.0" encoding="Shift_JIS"?>の定義もあります。 よろしくお願いいたします。 | ||||||||
|
投稿日時: 2007-01-19 14:06
すみません。追記です。
Tomcat5.5 + JSP + Java5 でのJSPサーブレットアプリケーションで XercesはXalan-J_2.7.0に付属しているものを使用しています。 (ユーザからの要望です) スレッドを検索し、Java5にはxercesが入っているという記事を確認し 使用してみましたが、結果は同じでした。 XercesをXerces_2.9.0にしてみましたが結果代わりませんでした。 JDKに入っているXercesは com.sun.org.apache.xerces.internal.parsers.DOMParser で問題ないしょうか。 以上、よろしくお願いします。 | ||||||||
|
投稿日時: 2007-01-19 14:11
Shift_JISには互換性のないバリエーションがあって、 Shift_JIS、SJIS、MS932、Windows-31Jといった名前になります。 この辺りの単語で検索すると情報は色々見つかりますよ。 最近のJREでは-Dsun.nio.cs.map=Windows-31J/Shift_JISをVMオプションに 指定する事でShift_JISをWindows-31Jの別名に変更する事も可能です。 #オススメはShift_JISを捨てることかと。。。 | ||||||||
|
投稿日時: 2007-01-19 15:16
あしゅさん有難う御座います。 自分でも色々調べては見たのですが文字コードはかなり苦手でして、、、 普通にStreamに書き出すときは文字化けは発生しないんですけど、、 パースした時に限り全角マイナスが化けるのが気になって気になって、、 (テストのためにWindows機種依存文字も使用してみましたが、化けていました)
早速引数を試して確認してみましたが、結果は変わりませんでした。 既存システムの改修作業でして、既にXMLファイルが数万件あるので XMLファイルの文字コードはShift_JISのままになると思います。 期間も余りありませんが引き続き調べを継続しますので よろしくお願いします。 | ||||||||
|
投稿日時: 2007-01-19 21:31
Shift_JISをUTF-8に変換してからParseすればよいのでは?
ちなみに、以下のようなコードでとりあえず、文字化けはしません。 StringBuffer buf = new StringBuffer(); BufferedReader br = new BufferedReader( new FileReader(""C:\\\\test.xml")")); String line; while((line = br.readLine()) != null) { buf.append(line.replaceFirst("Shift_JIS", "UTF-8")); } br.close(); parser.parse(new InputSource( new ByteArrayInputStream(buf.toString().getBytes("UTF-8")))); Document doc = parser.getDocument(); | ||||||||
|
投稿日時: 2007-01-20 13:56
あしゅさん、大変申し訳ありませんでした。 あしゅさんに指摘していただいたVM引数でParseで生成されたDocツリーは文字化けが 解消できました。有難う御座います。 ※色々テンパっていたので見落としていたようです。 つばささん、別な手法を考えて頂いて有難う御座います。 まだ実装確認しておらず、大変申し訳ないと思っておりますが、 こちらも実現方法の1つとして上に相談してみます。 -------------- 現状は、あしゅさんの方法で Parse後のXMLとXSLを変換させHTMLを出力までは確認出来ているのですが、 全角ハイフンがサニタイズされ、表示上は問題ないのですが hiddenに格納された値(サニタイズ後の値)がPOSTされる際に サニタイズされた値のままになって処理されるという 本件とは別の問題が発生しているという状態です。 CharacterEncodingFilter等もしているのですが、、、 -------------- 現状報告とさせていただきます。 |
1