- PR -

JavaからのDB操作による文字化け

投稿者投稿内容
mm
会議室デビュー日: 2003/09/03
投稿数: 16
投稿日時: 2003-09-03 12:20
はじめて投稿させていただきます。

JavaからPostgreSQLを利用した際に日本語の文字化けを起こしてしまいます。
文字化けする内容は日本語部分がすべて?????になることです。
何か変な文字ではなくすべて?になります。

環境は
TurboLinux 8.0
Tomcat 4.1.24
JDK 1.4.2
PostgreSQL 7.3.4  です。

インストールは普通に行いましたがantを入れていないのでJDBCは下記から
ダウンロードしたものをそのまま利用しています。
http://jdbc.postgresql.org/download.html
↑ pg73jdbc3.jar

SSHからpsqlにてそのまま利用すると日本語も文字化けしないでそのまま
きちんと表示されます。
showでクライアントエンコードを確認するとEUC_JPになっています。

また、ウィンドウズのアプリのCSEというのからアクセスをし同じ動作を
行った際にも特に文字化けを起こしません。

原因はJavaにあると思いますがDBへのアクセスはJakartaのDBCPを利用し
JSPのページエンコードはShift-JISにしています。
DBCPは下記サイトの内容とほぼ同じでコード内にエンコードの処理を
記入しているところはありません。
http://www.mobster.jp/wiki/index.jsp?pid=Commons

エンコード自体はどこも変更していないのでデフォルトのままであると思います。
initdbの際にはEUC_JPを付加しています。
気になる点はinitdbの際に--no-localeの指定ができなかったことくらいです。

ご教授いただければと思います。
よろしくお願いします。
未記入
大ベテラン
会議室デビュー日: 2003/06/28
投稿数: 219
投稿日時: 2003-09-03 12:33
mm様はじめまして!
回答でなくて本当に申し訳ございません。恐らく記述上の問題と思いますが
Shift_JIS
EUC-JP
だったと思います。これ(_ or -)紛らわしいですよね。

[ メッセージ編集済み 編集者: Ken-Lab 編集日時 2003-09-03 12:37 ]
mm
会議室デビュー日: 2003/09/03
投稿数: 16
投稿日時: 2003-09-03 17:00
Ken-Lab 様

返信ありがとうございます。
最初はそれだと思っていたのですが
実際ページエンコードを
<%@ page contentType="text/html; charset=EUC-JP"
にしてEUCにしても
???の文字化けのままになります。

実際どのようにページが遷移しているかというと
JSP → Servlet → PostgreSQL → Servlet → JSP
という流れをたどっています。
もちろんDBから引っ張ってきたデータ以外はきちんと表示されています。

他に考えられる原因は何かありますか?

よろしくお願いします。




mm
会議室デビュー日: 2003/09/03
投稿数: 16
投稿日時: 2003-09-03 21:41
Ken-Lab 様

かなり見当違いな返答をしてしまいました。
手法ではなく書き方のことでしたね。すみません。

とりあえずSQLを流して得たデータを直接アウトプットしても
????なのでJDBCの部分でなにか起きているのかと思います。
ドキュメントを参照していて、また少しいじってみようと思います。

何かおわかりになりましたらご教授いただければと思います。

よろしくお願いいたします。
未記入
大ベテラン
会議室デビュー日: 2003/06/28
投稿数: 219
投稿日時: 2003-09-03 22:17
いや〜即答できなくて申し訳ない!
というのは、一昨日までRHL8をインストールしてあったPCにFreeBSDを入れてしまったんで
大慌てでLinux8 + j2sdk + PostgreSQL + Tomcat4.1 + JDBC の環境を構築してます。
ちょっと確認まで時間がかかりそうなので、何かわかりましたらレス入れま〜す。

JDBCの問題 > 当たりかもしれませんね、恐らく。
# 可能性は低いと思いますが、どこかでISO8859_1になっているかな〜?

[ メッセージ編集済み 編集者: Ken-Lab 編集日時 2003-09-03 22:20 ]
mm
会議室デビュー日: 2003/09/03
投稿数: 16
投稿日時: 2003-09-04 01:06
Ken-Lab 様

ありがとうございます。
とりあえずJDBCがらみをいろいろ調べております。
PosgreSQLの日本語サイトに7.3.4のドキュメントが
あり、そちらにマルチエンコードについて
いろいろと書いてありましたので明日実践
してみようと思っています。

今気になっているのはデータ登録をCSEというので一括で
CSV登録をしたのも気になっているのでpsqlからの登録と
Java経由での登録とでさまざま比較してみようと思います。

なにかわかりましたらお教えください。
よろしくお願いします。


未記入
大ベテラン
会議室デビュー日: 2003/06/28
投稿数: 219
投稿日時: 2003-09-04 11:13
こんにちは。Ken-Labです。
経過報告ということで・・・。なんとなく文字エンコードがどこかで誤って判別されるように
思われます(JDBCの問題か、設定の問題か?)。かなり荒っぽい実験ソースでなんですが、
これで日本語の読み書きができました。

書き込み用JSPソース
コード:

<%@ page pageEncoding = "EUC-JP" contentType="text/html;charset=EUC-JP" %>
<%@ page import="java.sql.*, org.apache.commons.dbcp.*, org.apache.commons.pool.impl.*" %>
<%
String words = "日本語表示です";
words = new String (words.getBytes ("EUC_JP"), "8859_1");

try{
Class.forName ("org.postgresql.Driver");
Connection conn = DriverManager.getConnection
("jdbc:postgresql://192.168.0.30:5432/postgres", "postgres", "postgres");
Statement state = conn.createStatement ();

String sql = "insert into test values ('" + words + "')";
state.executeUpdate (sql);
out.println ("書き込み完了");
}
catch (Exception e){
out.println (e.toString ());
}
%>



読み込み用JSPソース
コード:

<%@ page pageEncoding = "EUC-JP" contentType="text/html;charset=EUC-JP" %>
<%@ page import="java.sql.*, org.apache.commons.dbcp.*, org.apache.commons.pool.impl.*" %>
<%
String readout = "";
try{
Class.forName ("org.postgresql.Driver");
Connection conn = DriverManager.getConnection
("jdbc:postgresql://192.168.0.30:5432/postgres", "postgres", "postgres");
Statement state = conn.createStatement ();
String sql = "select * from test";
ResultSet resultset = state.executeQuery (sql);
while (resultset.next ()){
readout = resultset.getString (1);
readout= new String (readout.getBytes ("8859_1"), "EUC_JP");
out.println (readout);
}

}
catch (Exception e){
out.println (e.toString ());
}
%>



# DBにはISO8859_1(?)で記録されてしまうので、psqlによる管理はできないかも

[ メッセージ編集済み 編集者: Ken-Lab 編集日時 2003-09-04 11:46 ]

[ メッセージ編集済み 編集者: Ken-Lab 編集日時 2003-09-04 16:56 ]
ミグカリバー
常連さん
会議室デビュー日: 2003/07/21
投稿数: 29
投稿日時: 2003-09-04 13:31
間違いであったらすいません
apacheのhttpd.conf内にDefaultCharsetと言う項目があります
この項目の設定をEUC_JP等に変えてみるのはどうでしょうか

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