- PR -

XMLパーサ(Xerces)で全角マイナスが文字化け

1
投稿者投稿内容
まごまご
常連さん
会議室デビュー日: 2005/11/16
投稿数: 24
投稿日時: 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"?>の定義もあります。

よろしくお願いいたします。
まごまご
常連さん
会議室デビュー日: 2005/11/16
投稿数: 24
投稿日時: 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
で問題ないしょうか。

以上、よろしくお願いします。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2007-01-19 14:11
引用:

まごまごさんの書き込み (2007-01-19 13:58) より:
<?xml version="1.0" encoding="Shift_JIS"?>の定義もあります。



Shift_JISには互換性のないバリエーションがあって、
Shift_JIS、SJIS、MS932、Windows-31Jといった名前になります。
この辺りの単語で検索すると情報は色々見つかりますよ。

最近のJREでは-Dsun.nio.cs.map=Windows-31J/Shift_JISをVMオプションに
指定する事でShift_JISをWindows-31Jの別名に変更する事も可能です。

#オススメはShift_JISを捨てることかと。。。
まごまご
常連さん
会議室デビュー日: 2005/11/16
投稿数: 24
投稿日時: 2007-01-19 15:16
引用:

Shift_JISには互換性のないバリエーションがあって、
Shift_JIS、SJIS、MS932、Windows-31Jといった名前になります。
この辺りの単語で検索すると情報は色々見つかりますよ。


あしゅさん有難う御座います。

自分でも色々調べては見たのですが文字コードはかなり苦手でして、、、
普通にStreamに書き出すときは文字化けは発生しないんですけど、、
パースした時に限り全角マイナスが化けるのが気になって気になって、、
(テストのためにWindows機種依存文字も使用してみましたが、化けていました)
引用:

最近のJREでは-Dsun.nio.cs.map=Windows-31J/Shift_JISをVMオプションに
指定する事でShift_JISをWindows-31Jの別名に変更する事も可能です。
#オススメはShift_JISを捨てることかと。。。


早速引数を試して確認してみましたが、結果は変わりませんでした。

既存システムの改修作業でして、既にXMLファイルが数万件あるので
XMLファイルの文字コードはShift_JISのままになると思います。

期間も余りありませんが引き続き調べを継続しますので
よろしくお願いします。
つばさ
ベテラン
会議室デビュー日: 2005/02/05
投稿数: 54
投稿日時: 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();
まごまご
常連さん
会議室デビュー日: 2005/11/16
投稿数: 24
投稿日時: 2007-01-20 13:56

あしゅさん、大変申し訳ありませんでした。
あしゅさんに指摘していただいたVM引数でParseで生成されたDocツリーは文字化けが
解消できました。有難う御座います。
※色々テンパっていたので見落としていたようです。

つばささん、別な手法を考えて頂いて有難う御座います。
まだ実装確認しておらず、大変申し訳ないと思っておりますが、
こちらも実現方法の1つとして上に相談してみます。

--------------
現状は、あしゅさんの方法で
Parse後のXMLとXSLを変換させHTMLを出力までは確認出来ているのですが、
全角ハイフンがサニタイズされ、表示上は問題ないのですが
hiddenに格納された値(サニタイズ後の値)がPOSTされる際に
サニタイズされた値のままになって処理されるという
本件とは別の問題が発生しているという状態です。
CharacterEncodingFilter等もしているのですが、、、
--------------

現状報告とさせていただきます。
1

スキルアップ/キャリアアップ(JOB@IT)