- PR -

JSP文字化けについて

投稿者投稿内容
ティー
会議室デビュー日: 2003/07/16
投稿数: 6
投稿日時: 2003-07-16 15:18
はじめまして。いつものぞかせてもらってますが、始めて
書き込みします。JSP超初心者で質問の仕方が悪いと思いますが
よろしくお願いします。

今、『新人SEのためのJava講座 作りながら理解する
「JSPコーディング・テクニック』を参考にしながら、
1ヶ月のスケージュール管理できる画面を作成しています。

この『新人SEのためのJava講座 作りながら理解する
「JSPコーディング・テクニック』のように
JAVAロジック部分で変数に動的なHTMLタグを格納し

for(int i = 1 ; i <= 1か月分の日数; i++){

ResultSet rs;
String quary = "";
quary += "SELECT * FROM yotei WHERE year = 2003";
quary += " AND month = 7";
quary += " AND day = " + i;
Statement stmt = con.createStatement();
rs = stmt.executeQuery(quary);
yotei = rs.getString("yotei");
tableRows.append("<td bgcolor=#FFFFFF>");
tableRows.append("i");
tableRows.append("</td>");
tableRows.append("<td bgcolor=\"#ffffff\" nowrap align=left width=70>");
tableRows.append(yotei);
tableRows.append("</td>");

}

HTML部分で
<%= tableRows %> と出力させています。
どうしても文字化けがするのでいろいろ調べた結果
この1か月分のループが多い場合文字化けするようでループの回数を5回
くらいに減らして表示すると文字化けせずに表示できます。
なにか変数に格納する文字数なので文字化けに影響があるものなのでしょうか?

開発環境は
OS Linux
Webサーバ Apache
サーブレット・コンテナ Tomcat
JDK J2SE 1.3.1 です。


R-55
常連さん
会議室デビュー日: 2003/03/13
投稿数: 29
投稿日時: 2003-07-16 16:47
R-55です。

関係ないかも知れませんが

>tableRows.append("i");



>tableRows.append(i);

の間違いではないでしょうか?
ティー
会議室デビュー日: 2003/07/16
投稿数: 6
投稿日時: 2003-07-16 16:54
R-55さん&みなさん、すいません。
書き込み用に簡単に書いたため書き間違えたみたいです。
正確には

tableRows.append(i);

にしています。

また何かわかった事ありましたら、みなさんお願いしますm(_ _)m






未記入
大ベテラン
会議室デビュー日: 2003/06/28
投稿数: 219
投稿日時: 2003-07-16 17:14
tableRows中に特定の文字(例をあげると<>’”または%など)が含まれていることはないでしょうか?

# 追加しました


[ メッセージ編集済み 編集者: Ken-Lab 編集日時 2003-07-16 17:28 ]
ティー
会議室デビュー日: 2003/07/16
投稿数: 6
投稿日時: 2003-07-16 17:46
Ken-Labさん、返信ありがとうございます。

>tableRows中に特定の文字(例をあげると<>’”または%など)が含まれていることはないでしょうか?

これは予約語は文字列に含むとダメということでしょうか?
実際のロジックは以下のような感じです。

’”→ \' \" で処理しているのですが、これではまずいのでしょうか?

tableRows.append("<td bgcolor=#FFFFFF>");
tableRows.append("<a href=\"javascript:ImageUp(\'Entory.jsp?");
tableRows.append("YEAR=");
tableRows.append(cYear);
tableRows.append("&MONTH=");
tableRows.append(cMonth);
tableRows.append("&DAY=");
tableRows.append(i);
tableRows.append("\');\">");
tableRows.append(i);
tableRows.append("</a>");
tableRows.append("</td>");
try{
ResultSet rs;
String quary = "";
quary += "SELECT * FROM yotei WHERE year = 2003";
quary += " AND month = 7";
quary += " AND day = " + i;
Statement stmt = con.createStatement();
rs = stmt.executeQuery(quary);
while (rs.next()){
A = rs.getString("a");
B = rs.getString("b");
C = rs.getString("c");
D = rs.getString("d");
E = rs.getString("e");
F = rs.getString("f");
G = rs.getString("g");
}
rs.close();
stmt.close();
tableRows.append("<td bgcolor=\"#ffffff\" nowrap align=left width=70>");
tableRows.append(A);
tableRows.append("</td>");
tableRows.append("<td bgcolor=\"#ffffff\" nowrap align=left width=220>");
tableRows.append(B);
tableRows.append("</td>");
tableRows.append("<td bgcolor=\"#ffffff\" nowrap align=right width=50>");
tableRows.append(C);
tableRows.append("</td>");
tableRows.append("<td bgcolor=\"#ffffff\" nowrap align=right width=50>");
tableRows.append(D);
tableRows.append("</td>");
tableRows.append("<td bgcolor=\"#ffffff\" nowrap align=right width=50>");
tableRows.append(E);
tableRows.append("</td>");
tableRows.append("<td bgcolor=\"#ffffff\" nowrap align=right width=50>");
tableRows.append(F);
tableRows.append("</td>");
tableRows.append("<td bgcolor=\"#ffffff\" nowrap align=left width=160>");
tableRows.append(G);
tableRows.append("</td>");
tableRows.append("</tr>");
}
未記入
大ベテラン
会議室デビュー日: 2003/06/28
投稿数: 219
投稿日時: 2003-07-16 20:43
Ken-Labです。

> ’”→ ' \" で処理しているのですが、これではまずいのでしょうか?

これでOKです。
先程エスケープ文字についてコメントしましたが、こちらで再現実験して
みたところ問題が出ませんでした。すみません。
そうしますと、ティーさんが仰るとおり文字長による問題かと考えまして、ご提示
いただいたソースコードを使って簡単にサンプルを作成してみました。
DBアクセス部分は今環境がないので、そこはダミーですが。
コード:

<%@ page contentType="text/html" %>
<html>
<head>
<title>Test</title>
</head>
<body>
<table border="1">
<%
String A = "AAAAAAAAAA";
String B = "BBBBBBBBBB";
String C = "CCCCCCCCCC";
String D = "DDDDDDDDDD";
String E = "EEEEEEEEEE";
String F = "FFFFFFFFFF";
String G = "GGGGGGGGGG";
String cYear="2003";
String cMonth="7";
StringBuffer tableRows = new StringBuffer();
for (int i = 1; i <= 31; i++){
tableRows.append("<tr>");
tableRows.append("<td bgcolor=#FFFFFF>");
tableRows.append("<a href=\"javascript:ImageUp('Entory.jsp?");
tableRows.append("YEAR=");
tableRows.append(cYear);
tableRows.append("&MONTH=");
tableRows.append(cMonth);
tableRows.append("&DAY=");
tableRows.append(i);
tableRows.append("');\">");
tableRows.append(i);
tableRows.append("</a>");
tableRows.append("</td>");
tableRows.append("<td bgcolor=\"#ffffff\" nowrap align=left width=70>");
tableRows.append(A);
tableRows.append("</td>");
tableRows.append("<td bgcolor=\"#ffffff\" nowrap align=left width=220>");
tableRows.append(B);
tableRows.append("</td>");
tableRows.append("<td bgcolor=\"#ffffff\" nowrap align=right width=50>");
tableRows.append(C);
tableRows.append("</td>");
tableRows.append("<td bgcolor=\"#ffffff\" nowrap align=right width=50>");
tableRows.append(D);
tableRows.append("</td>");
tableRows.append("<td bgcolor=\"#ffffff\" nowrap align=right width=50>");
tableRows.append(E);
tableRows.append("</td>");
tableRows.append("<td bgcolor=\"#ffffff\" nowrap align=right width=50>");
tableRows.append(F);
tableRows.append("</td>");
tableRows.append("<td bgcolor=\"#ffffff\" nowrap align=left width=160>");
tableRows.append(G);
tableRows.append("</td>");
tableRows.append("</tr>\n");
}
%><%= tableRows %>
</table>
</body>
</html>


こちらの環境では狙いどおり表示されました。
私の目が節穴で何か見落としているかもしれませんが、文字長による問題か
あるいは問題が発生する5行目前後のデータに何か問題があるのか、切り分けないと
原因が特定できないかもしれません。
それから、jdk,Tomcat,apacheのバージョンに依存している可能性もありますので
それも明記していただいたほうが、的確なアドバイスをいただけると思います。

#で、こちらの環境は Win2k sp3, jdk1.4.1_03, Tomcat4.1.24 です。

# 追記です
# 質問内容を一部読み誤って、少々的外れなコメントをしてました。
# 肝心なことを・・。文字化けが発生するとき、全体に渡って発生するのか、一部分だけ
# 発生するのか。また、化けた状態は(「?」となるとか)あと、DBは何をお使いでしょうか?

[ メッセージ編集済み 編集者: Ken-Lab 編集日時 2003-07-16 21:06 ]

[ メッセージ編集済み 編集者: Ken-Lab 編集日時 2003-07-17 08:40 ]
グーフィー
会議室デビュー日: 2003/07/07
投稿数: 9
投稿日時: 2003-07-16 23:08
グーフィーです。はじめまして。

的確なアドバイスはできませんが、DBに登録されている
内容は日本語とか含まれてませんか?
あと「〜、-、梶vのような文字も含まれてませんか?

文字列長で文字化けすることって無いと思いますよ。

こういった問題が発生したときは、どこに問題があるか
突き止めるのが先決です。ソース全てに対して調査するのでは
なく、確実に動くところ(このソースでは正常に表示される)
を除外していって絞り込んでいく作業が必要なのではないで
しょうか?
慣れるまでは大変ですけどね。

あと、疑わしいのはJSP。
<%@ page contentType="text/html;charset=XXX" %>
のXXXで指定している内容です。

何かのヒントにでもなれば幸いです。
ティー
会議室デビュー日: 2003/07/16
投稿数: 6
投稿日時: 2003-07-17 11:05
ティーです。返信遅くなりました。
Ken-Labさん、グーフィーさんありがとうございます。

Ken-Labさん、
>それから、jdk,Tomcat,apacheのバージョンに依存している可能性もありますので
>それも明記していただいたほうが、的確なアドバイスをいただけると思います
バージョンなんですが
Linux J2SE1.3.1 Tomcat4.0 Apache1.3.12 DBはOracle8iです。
文字化けの状態なんですが「?」ではなく半角カタカナと感じが混ざっています。
「ヌッ7キハャ」といった感じです。
私もKen-Labさんのソースコード(DBアクセス抜き)をこちらの環境で実行してみた
のですが、文字化けは発生しませんでした。
となるとやはり文字数ではなくDBアクセス部分が問題になってる可能性が高い
ということでしょうか?他にもいくつかDBアクセスする簡単なアプリケーション
を作った時には問題がなかったので、その可能性はあまり考えていませんでした。

グーフィーさん
>内容は日本語とか含まれてませんか?
>あと「〜、-、梶vのような文字も含まれてませんか?
今はデータは何もない状態で動かしているので「〜、-、梶vの
文字はないんです。

>あと、疑わしいのはJSP。
><%@ page contentType="text/html;charset=XXX" %>
>のXXXで指定している内容です。
XXXは「EUC_JP」にしています。UNIX系のサーバの場合は
「EUC_JP」にするというようなことをどこかで見まして、今まで
いくつかのアプリケーションではそれでうまく行っていたのですが。

>こういった問題が発生したときは、どこに問題があるか
>突き止めるのが先決です。ソース全てに対して調査するのでは
>なく、確実に動くところ(このソースでは正常に表示される)
>を除外していって絞り込んでいく作業が必要なのではないで
>しょうか?
>慣れるまでは大変ですけどね。

はい。本当にその通りですね。私の場合、WEBの環境は別の人間が
構築した状態でServlet,JSPの勉強を始めたので、Tomcat,Apacheその他
環境のことがほとんどわからない状態で・・・
文字化けに関してはWEBの環境、バージョンなどまでしっかり知っておく
必要があったと改めて痛感しています。

お2人とも本当にありがとうございます。再度みなさんの返信を参考に
がんばってみます。またなにか気のつく点ありましたらよろしくお願い
します。

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