- PR -

DOMのXSLT化で文字化け?@linux

1
投稿者投稿内容
momo
常連さん
会議室デビュー日: 2006/11/06
投稿数: 35
投稿日時: 2007-10-03 19:12
JDK5.0、Tomcat5.5上で動かしております。
DBのデータからXMLを作成し、SOAP経由でウィンドウズクライアントに文字列を
返しています。

import javax.xml.transform でDOMを文字列化しています。
今まではウィンドウズ上で動かしており問題はなかったのですが、
今回Linuxサーバ上に移動したところ全角文字がすべて"?"に化ける
ようになってしまいました。

化けている状態をのを確認した箇所は、ウィンドウズクライアントが
サーバから受け取ったXMLをファイルにはいたもの、および、
javaがはいているXML文字列のログファイル(出力エンコードはTransForm時の
ものと同じものを指定)です。二つのファイルともまったく同じように化けています。
DOMに入れる前の化けるデータをWin側に直接返してやると化けていませんでした。
そこで化ける原因はTransform時にあると思い至りました。

DOMはタグ名をstatic finalなStringで定義し、中のデータはOracleから
とってきています。
Oracleの文字列はNVARCHAR2に入っており、NCHAR系のキャラセットは
AL16UTF16になります。

setOutputPropertyでセットするエンコードをwindows-31Jだけでなく、
Shift-JIS、EUC-JP、UTF-8、UTF-16等で試してみましたが、化け方はそれぞれ違いますが、全部化けてしまいました。

DBからとってきた文字データを別の文字コードに変換する必要などがあるのでしょうか?
かなりお手上げの状態にいます。


<CODE>

public static String convert2String(Document doc)throws EccException
{
String strRetXML = "";
TransformerFactory factory = TransformerFactory.newInstance();
Transformer tr = factory.newTransformer();

//インデントを行う
tr.setOutputProperty(OutputKeys.INDENT, "yes");
tr.setOutputProperty(OutputKeys.METHOD, "xml");
tr.setOutputProperty(org.apache.xml.serializer.OutputPropertiesFactory.S_KEY_INDENT_AMOUNT, "2");


//〜が化けるのでwindows-31J
String strENC = "windows-31j";
tr.setOutputProperty(OutputKeys.ENCODING, strENC);

//DOMソース
DOMSource source = new DOMSource();
source.setNode(doc);

//退避ストリーム
ByteArrayOutputStream buffOut = new ByteArrayOutputStream();

Result result = new StreamResult(buffOut);
tr.transform(source, result);

strRetXML = buffOut.toString();

buffOut.close();

//"windows-31J"をむりやり"Shift-JIS"に変換
strRetXML = strRetXML.replaceFirst(strENC, "Shift_JIS");

System.out.println(strRetXML);
return(strRetXML);

以下略

</CODE>

1

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