こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

ブラウザの検索フォームから入力した日本語が正常に認識されない件について

最近Javaを習い始め、Eclipseを使ってサーブレット/JSPを学習している者です。
EclipseのバージョンはVersion: 3.4.1です。
使っているデータベースはOracle9iです。

現在、JSPで表示させたブラウザに検索用のフォームを表示させて、
表示された検索フォームに文字(日本語、アルファベット、数字、記号)を入力して、入力された文字が一致するレコードをデータベースから引っ張って、検索結果をブラウザに表示させるプログラムを作っています。

問題はブラウザから入力された文字が半角英数や記号なら正常に検索結果を表示してくれるのですが、仮にaと入力するとブラウザのアドレスフォームの表示は"ローカルホストのアドレス?keyword=a"となります。しかし、日本語や全角文字を入力すると、仮に「あ」と入力して検索ボタンを押すと、ブラウザのアドレスフォームの表示が"ローカルホストのアドレス?keyword=%82%A0"となってしまい、検索結果が表示されません。(Googleなどで色々調べてみたのですが、%82%A0はひらがなの「あ」のShift_JISコードのようです。)

Eclipseのデバッグモードでデバッグしてみると、ブラウザから入力された文字(あ)=keywordが・や・3みたいな文字になっていました。
この・や・3を切り取ってメモ帳に保存しようとすると「このファイルは、ANSIテキストファイルとして保存すると失われてしまうUnicode形式の文字を含んでいます。Unicodeの情報を保存するには、下の[キャンセル]をクリックし、[文字コード]から[Unicode]を選択してください。続行しますか?」と表示されてメモ帳に保存できませんでした。

データベースに直接SQL+で同じ検索コマンドを入力したら、正常に検索結果が表示されました。
Eclipseの設定やIE6.0ブラウザのエンコードを変えてみましたが、うまくいきませんでした。
JSPやサーブレットのエンコードはWindows-31Jに統一しています。
Eclipseの設定が間違っているのでしょうか?

もし何か解決方法を知っている方がいましたら教えてください。よろしくお願いいたします。

検索フォームのJSPのソース(一部抜粋)
<input type="text" name="keyword">
<input type="submit" value="検索">

入力された文字を受け取るサーブレットのソース(一部抜粋)
request.setCharacterEncoding("Windows-31J");

String keyword = request.getParameter("keyword");
String sql = "SELECT * FROM BOOK_LIST "
+ "WHERE BOOK_NAME LIKE '%" +keyword+ "%'";

Connection con = null;
Statement smt = null;

投稿日時 - 2009-02-27 15:27:23

QNo.4753742

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

どうもtomcat6.0.18のバグっぽいんだけど
-----------------------------------------------------------------
String keyword = request.getParameter("keyword");
keyword = new String(keyword.getBytes("iso8859_1"), "Windows31-J");
-----------------------------------------------------------------
にしたらどうでしょう?

tomcat6.0.16だったらこんな必要ないらしい。

投稿日時 - 2009-02-27 22:43:55

補足

何度も回答を頂きありがとうございます。
学習している場所が土日祝は使用できないので、
教えて頂いた方法をすぐに試すことが出来ないのですが、
月曜日に教えて頂いた方法を試して結果を報告いたします。

投稿日時 - 2009-02-28 09:52:48

お礼

教えて頂いた上記の
----------------------------------------------------------------
String keyword = request.getParameter("keyword");
keyword = new String(keyword.getBytes("iso8859_1"), "Windows31-J");
----------------------------------------------------------------
にサーブレット側のコードを変更して試してみたのですが
うまくいかず、HTTPステータス500の表示も出てしまい、
日本語は認識できませんでした。
調べてみたところ、私の使っているTomcatサーバは6.0.16でした。
Tomcatに何か問題があるのでしょうか...

投稿日時 - 2009-03-02 09:37:49

ANo.2

#1です。
Tomcatバージョンが5.x以降だったら可能性ありです。

投稿日時 - 2009-02-27 17:02:57

お礼

回答ありがとうございます。
御指示通りに

・GetでなくPostに変更
又は
・server.xmlのConnectorタグに
useBodyEncodingForURI="true"

を両方試してみたのですが、結果は同じでした。
server.xmlはEclipse側のserver.xmlとCドライブ側のserver.xmlの両方のConnectorタグにuseBodyEncodingForURI="true"を追加して、Eclipseを再起動した後にTomcatサーバを再起動して実施したのですが、状況は変わりませんでした。
ちなみにプロジェクトは動的Webプロジェクトを使用していて、サーバのポートはデフォルトの8080ではなく、別のポートに設定してます。

投稿日時 - 2009-02-27 18:42:16

ANo.1

Tomcatバージョンが5.xであれば以下いずれかを試してください。
・GetでなくPostに変更
又は
・server.xmlのConnectorタグに
useBodyEncodingForURI="true"
を追加

投稿日時 - 2009-02-27 15:55:51

お礼

早速の回答ありがとうございます。
付け忘れましたが、OSはWindows-XPで、サーバーはTomcat6.0です。

投稿日時 - 2009-02-27 15:57:45

あなたにオススメの質問