- - PR -
サーブレットで文字化け
1|2|3
次のページへ»
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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>" ); } } |
|
投稿日時: 2007-06-04 00:01
・サーブレットで文字列を受け取ったタイミング
・データベースに入力したタイミング ・データベースから取得したタイミング ・サーブレットからブラウザに出力したタイミング 、のどこで化けているか確認しましょう。 |
|
投稿日時: 2007-06-04 07:15
インギさん、ご回答ありがとうございます。
>サーブレットで文字列を受け取ったタイミング >データベースから取得したタイミング >のどこで化けているか確認しましょう。 System.out.printlnメソッドで char_test.javaのtestStrや show_test.javaのstr_testに代入した直後の 値をコンソールへ表示させるということですか? 実は、本番環境はレンタルサーバーで動かしているので コンソールは使えないのです。 他に確認方法をご存知ありませんでしょうか。 >データベースに入力したタイミング これは、どのように確認するのでしょうか? 確認方法を教えていただけないでしょうか。 よろしくお願いします。 |
|
投稿日時: 2007-06-04 08:30
ローカルサーバーくむという方法もあるし、サーバで動かしていてもテルネット等でログはみれる
|
|
投稿日時: 2007-06-04 09:14
Servletに直に書き込まれている文字列"あ"が
DBに入ったら文字化けしていると書いてあるので そこの間に原因があるのでしょう。 MySQLは使ったことないので詳しくはわかりませんが 日本語の取り扱いに何かあるのかも? あと、 Statement よりも PreparedStatementが好きだな。 個人的には。 ところで Servletを使わずに直接DBに"あ"を入れたときは 画面に正常に表示されるのかどうかは試したのかな? まずそこからはじめないと 仮に入力が正常になっても出力がおかしければ いつまでも入力が間違っているに違いない と思い込んでしまうことになりかねない。 |
|
投稿日時: 2007-06-04 10:30
MySQLが4.1以降ですね・・。DB側もSJISのようですが、念のため(SQLで)「SET NAMES sjis」を発行してから処理したらどうなりますか?
|
|
投稿日時: 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 ] |
|
投稿日時: 2007-06-05 08:21
杏様
あすか様 shimix様 だっちょ様 ご回答ありがとうございます。 >ローカルサーバーくむという方法もあるし、サーバで動かしていてもテルネット等で>ログはみれる ローカルサーバーですか。勉強してみます。 ログを見てみましたが、何も見当たりませんでした。 見ているところが違うのかもしれません。 もう少し調べてみます。 >Servletを使わずに直接DBに"あ"を入れたとき 日本語入力ができないのです。 やはりここに問題があるのですかね。 今サーバー管理者に質問してみます。 >DB側もSJISのようですが、念のため(SQLで)「SET NAMES sjis」を発行してから処理>したらどうなりますか? やはり"?"と表示されてしまいました。 >だっちょ様 教えていただいたURLを参考に 明日以降試してみたいと思います。 また後日書き込みます。 今後もよろしくお願いします。 |
1|2|3
次のページへ»