- PR -

サーブレットで文字化け

投稿者投稿内容
and1
会議室デビュー日: 2007/05/27
投稿数: 13
投稿日時: 2007-06-03 21:49
初めまして、and1と申します。

早速、質問がありますのでよろしくお願いします。

以下の手順を行うと文字化けが発生します。
どのようにすれば、文字化けを直せるでしょうか
コーディング、設定、デバックの方法など
ご存知でしたら、少しでもいいので
是非ご回答よろしくお願いします。

長文で申し訳ございません。

●手順

@char_test.htmlで
"登録"ボタンを押下する。

Achar_test.classによって
DBに"あ"という文字列がテーブル"test_tb"に登録される。

Bchar_test.htmlで
"表示"ボタンを押下する。

Cshow_test.classによってテーブル"test_tb"
に登録されているデータをブラウザに表示する。

結果:ブラウザに"あ"と表示されているはずの箇所に
   ?と表示される。

本番環境、テスト環境両方とも
DBにログインしSELECT文でデータを見ても
??となっていますが、テスト環境の場合はそのデータを
ブラウザに表示するとき正しく日本語で表示されます。
本番環境では??と文字化けします。

DBにおける文字コードの設定は本番、テスト環境両方とも以下のとおりです。
Server characterset: latin1
Db characterset: sjis
Client characterset: latin1
Conn. characterset: latin1

クラスファイルについては
・windows環境でjavaファイルをコンパイルしてFTPでクラスファイルを送信
・サーバー(FreeBSD)内でコンパイルしクラスファイルを生成
を両方試しましたが、変化はありませんでした。

●本番環境
OS:FreeBSD
データベース:MYSQL 4.1.18
TOMCAT:4.1.31

●テスト環境
OS:WindowsXP
データベース:MYSQL 4.1.21
TOMCAT:5.0.28

●コード(補足)

================test.jsp================

<%@ page contentType="text/html; charset=Shift_JIS"
pageEncoding="Shift_JIS" %>
<% request.setCharacterEncoding("Shift_JIS"); %>


<html>
<body>

<BR>
”あ”をDBに登録<BR>
<form action="char_test" method="post" >
<input type="submit" value="登録">
</form>
<BR>
テキストボックスの値をPrintWriterクラスでブラウザに表示
<BR>
<form action="show_test" method="post" >
<input type="submit" value="表示">
</form>
</body>
</html>

================char_test.java================

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;
import javax.servlet.ServletContext;
import javax.servlet.RequestDispatcher;
import java.io.*;
import java.sql.*;
import java.util.*;

public class char_test extends HttpServlet
{

String testStr="あ";

Connection con = null;
Statement stmt = null;
Exception exception;

public void doPost( HttpServletRequest req,
HttpServletResponse res )
throws ServletException, IOException
{

try
{

Class.forName( "com.mysql.jdbc.Driver" );

String jdbcurl = "jdbc:mysql://localhost/DB名";

Properties props = new Properties();
props.put("user", "root");
props.put("password", "パスワード");
props.put("useUnicode", "true");
props.put("characterEncoding", "Shift_JIS");

con = DriverManager.getConnection( jdbcurl, props );

String sql="insert into test_tb(input_str) values('"+testStr+"')";

stmt = con.createStatement();
int kekka = stmt.executeUpdate(sql);

String target = "/test.jsp";
ServletContext context = getServletContext();
RequestDispatcher rd = context.getRequestDispatcher( target );
rd.forward( req, res );
}
catch(Exception e)
{
req.setAttribute( "msg", e );

String target = "/Error.jsp";
ServletContext context = getServletContext();
RequestDispatcher rd = context.getRequestDispatcher( target );
rd.forward( req, res );
}
}
}

================show_test.java================
import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;
import java.io.*;

public class show_test extends HttpServlet
{
private String str_test=null;
private Vector vec_test=null;

Connection con = null;
Statement stmt = null;
ResultSet rs = null;
Exception exception;

public void doPost( HttpServletRequest req,HttpServletResponse res ) throws ServletException, IOException
{
try {

Class.forName( "com.mysql.jdbc.Driver" );

String jdbcurl = "jdbc:mysql://localhost/DB名";

Properties props = new Properties();
props.put("user", "root");
props.put("password", "パスワード");
props.put("useUnicode", "true");
props.put("characterEncoding", "Shift_JIS");

con = DriverManager.getConnection( jdbcurl, props );
//infocheck
String sql_info ="select * from test_tb";

stmt = con.createStatement();
rs = stmt.executeQuery( sql_info );
vec_test=new Vector();

while(rs.next())
{
str_test=rs.getString("input_str");
vec_test.addElement(str_test);
}

//htmlに抽出データを表示
}
catch( Exception ex ) {
exception = ex;
}
res.setContentType( "text/html; charset=Shift_JIS" );
PrintWriter out = res.getWriter();

out.println( "<html>" );
out.println( "<head>" );
out.println( "<title></title>" );
out.println( "</head>" );
out.println( "<body>" );
for(int i = 0 ; i < vec_test.size() ; i++)
{
out.println( vec_test.elementAt(i)+"<BR>" );
}
out.println( "</body>" );
out.println( "</html>" );
}
}
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2007-06-04 00:01
・サーブレットで文字列を受け取ったタイミング
・データベースに入力したタイミング
・データベースから取得したタイミング
・サーブレットからブラウザに出力したタイミング
、のどこで化けているか確認しましょう。
and1
会議室デビュー日: 2007/05/27
投稿数: 13
投稿日時: 2007-06-04 07:15
インギさん、ご回答ありがとうございます。

>サーブレットで文字列を受け取ったタイミング
>データベースから取得したタイミング
>のどこで化けているか確認しましょう。

System.out.printlnメソッドで
char_test.javaのtestStrや
show_test.javaのstr_testに代入した直後の
値をコンソールへ表示させるということですか?

実は、本番環境はレンタルサーバーで動かしているので
コンソールは使えないのです。
他に確認方法をご存知ありませんでしょうか。

>データベースに入力したタイミング
これは、どのように確認するのでしょうか?
確認方法を教えていただけないでしょうか。

よろしくお願いします。

朝日奈ありす
大ベテラン
会議室デビュー日: 2007/05/02
投稿数: 189
お住まい・勤務地: 最北の地
投稿日時: 2007-06-04 08:30
ローカルサーバーくむという方法もあるし、サーバで動かしていてもテルネット等でログはみれる
あすか
ぬし
会議室デビュー日: 2006/07/12
投稿数: 309
投稿日時: 2007-06-04 09:14
Servletに直に書き込まれている文字列"あ"が
DBに入ったら文字化けしていると書いてあるので
そこの間に原因があるのでしょう。
MySQLは使ったことないので詳しくはわかりませんが
日本語の取り扱いに何かあるのかも?

あと、
Statement よりも PreparedStatementが好きだな。
個人的には。

ところで
Servletを使わずに直接DBに"あ"を入れたときは
画面に正常に表示されるのかどうかは試したのかな?
まずそこからはじめないと
仮に入力が正常になっても出力がおかしければ
いつまでも入力が間違っているに違いない
と思い込んでしまうことになりかねない。
shimix
ぬし
会議室デビュー日: 2004/08/05
投稿数: 512
お住まい・勤務地: 大分市
投稿日時: 2007-06-04 10:30
MySQLが4.1以降ですね・・。DB側もSJISのようですが、念のため(SQLで)「SET NAMES sjis」を発行してから処理したらどうなりますか?
だっちょ
大ベテラン
会議室デビュー日: 2006/12/05
投稿数: 115
投稿日時: 2007-06-04 17:06
 私の環境はEJB3でPostgreSQLに格納しているので、違うかもしれませんが、
http://www.atmarkit.co.jp/fjava/rensai3/mojibake03/mojibake03.html
を参考にrequest.setCharacterEndcodingを設定して(私のページはUTF-8 )
「あ」が格納されて表示できています。


[ メッセージ編集済み 編集者: だっちょ 編集日時 2007-06-04 17:08 ]
and1
会議室デビュー日: 2007/05/27
投稿数: 13
投稿日時: 2007-06-05 08:21
杏様
あすか様
shimix様
だっちょ様

ご回答ありがとうございます。

>ローカルサーバーくむという方法もあるし、サーバで動かしていてもテルネット等で>ログはみれる

ローカルサーバーですか。勉強してみます。
ログを見てみましたが、何も見当たりませんでした。
見ているところが違うのかもしれません。
もう少し調べてみます。

>Servletを使わずに直接DBに"あ"を入れたとき

日本語入力ができないのです。
やはりここに問題があるのですかね。
今サーバー管理者に質問してみます。

>DB側もSJISのようですが、念のため(SQLで)「SET NAMES sjis」を発行してから処理>したらどうなりますか?

やはり"?"と表示されてしまいました。

>だっちょ様

教えていただいたURLを参考に
明日以降試してみたいと思います。

また後日書き込みます。
今後もよろしくお願いします。

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