-PR-
締切済み

JSP/Servletのパラメータの受け渡しが文字化けしてうまくいきません。

  • 困ってます
  • 質問No.4412385
  • 閲覧数15843
  • ありがとう数8
  • 気になる数0
  • 回答数3
  • コメント数0

お礼率 56% (9/16)

JSP・Servlet・Beanがうまくいかなくて困っています。開発環境はWindowsXP JDK5とEclipse3.2とTomcat5.5を使って作っています。
じゃんけんをするゲームを作ったのですが、コンピュータの手は文字列も画像もきちんと出るのですが、自分の手が文字列は文字化けして画像も正しく表示されません。
JSPのcharsetやServletのrequest.setCharacterEncoding()メソッドなど文字化け等で考えられることはいろいろ調べてやってみたつもりなのですがどうもうまくいきません。コンソールに値を出力するようにしてデバックもやってみてはいるのですが、同様に文字化けした値が入ってしまいます。どなたかご教授下さい。以下にソースを書きます。
<!--JankenStart.jsp-->
<%@page language="java" import="java.lang.*, java.util.*"
contentType="text/html; charset=Shift_JIS"%>
<html>
<head><title>じゃんけんゲーム</title></head>
<body>
<h2>このゲームはコンピュータとじゃんけんをします!<br>
コンピュータに勝てるかな?</h2>
<form action="../JankenAction">
あなたの手:
<input type="radio" name="te1" value="グー">グー<img src="../img/hand4-1-3.gif">
<input type="radio" name="te1" value="チョキ">チョキ<img src="../img/hand4-1-1.gif">
<input type="radio" name="te1" value="パー">パー<img src="../img/hand4-1-2.gif"><p>
<center><input type="submit" value="勝負"></center>
</body>

//JankenAction.java
package servlets;
import java.io.*;import javax.servlet.*;import javax.servlet.http.*;import beans.JankenBean;
public class JankenAction extends HttpServlet{
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{
 request.setCharacterEncoding("Windows-31J");
 response.setCharacterEncoding("Windows-31J");
  String te=request.getParameter("te1");
  JankenBean jankenBean=new JankenBean();
  jankenBean.setJibun(te);
  jankenBean.setComputer();
  jankenBean.setHantei();
  request.setAttribute("hoge", jankenBean);
  RequestDispatcher rDispatcher=request.getRequestDispatcher("JSP/JankenKekka.jsp");
  rDispatcher.forward(request, response);
}
}
//JankenBean.java
package beans;
public class JankenBean {
private String computer=null;private String jibun=null;
private String hantei=null;private String jgazou=null;
private String cgazou=null;
public String getComputer(){
return computer;
}
public String getCgazou(){
return cgazou;
}
public void setComputer(){
int random =(int)(Math.random()*3);
if(random==0){
System.out.println("グー");
computer="グー";
cgazou="img/hand4-1-3.gif";
}
else if(random==1){
System.out.println("チョキ");
computer="チョキ";
cgazou="img/hand4-1-1.gif";
}else{
System.out.println("パー");
computer="パー";
cgazou="img/hand4-1-2.gif";
}
System.out.println("computer"+computer);
}
public String getJibun(){
return jibun;
}
public String getJgazou(){
return jgazou;
}
public void setJibun(String te){
jibun=te;
if(jibun.equals("グー")){
jgazou="img/hand4-1-3.gif";
}
else if(jibun.equals("チョキ")){
jgazou="img/hand4-1-1.gif";
}else{
jgazou="img/hand4-1-2.gif";
}
System.out.println("jibun"+jibun);
}
public String getHantei(){
return hantei;
}
public void setHantei(){
String hantei2="";
if( (computer.equals("グー"))&&(jibun.equals("チョキ"))||(computer.equals("チョキ"))&&(jibun.equals("パー"))||(computer.equals("パー"))&&(jibun.equals("グー")) ){
System.out.println("コンピュータの勝ち");
hantei2="コンピュータの勝ち";
}
  else if( (computer.equals("グー"))&&(jibun.equals("パー"))
    ||(computer.equals("チョキ"))&&(jibun.equals("グー"))
    ||(computer.equals("パー"))&&(jibun.equals("チョキ")) ){
System.out.println("あなたの勝ち");
hantei2="あなたの勝ち";
}else{
System.out.println("あいこ");
hantei2="あいこ";
}
hantei=hantei2;
}
}
通報する
  • 回答数3
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

回答 (全3件)

  • 回答No.2
レベル11

ベストアンサー率 58% (126/214)

> だと思うのですが
「だと思う」で仕事をしてはいけません。

TomcatのデフォルトはUTF-8なので、なにもかもUTF-8に統一するのがいちばん楽ですよ。
補足コメント
n_squirrel

お礼率 56% (9/16)

私は初心者で、まだ仕事としてはやっていません。
もちろん、それを目指しているわけですが・・・。
自分で考え試行錯誤して作ってみたわけですが、初心者はこちらで質問してはいけませんか?

ブラウザの表示のエンコードを見て判断したのですが、違っているのでしたらどのように調べるのか教えてください。
UTF-8にしてみましたが、やはり全体的に文字化けして更に酷くなってしまいます。
JSPのcharsetとServletのrequest.setCharacterEncoding()メソッドで統一するということですよね?
出来る限りのことはしてみたつもりですが、向いてないんでしょうか。
投稿日時 - 2008-10-19 20:59:06


  • 回答No.3
レベル11

ベストアンサー率 33% (102/307)

JankenStart.jspのエンコーディングがShift_JISなので、
te1の値もShift_JISで送信されてきていると思いますが、
 String te=request.getParameter("te1");
だと、そのままJavaはunicodeだと思って読み込んでしまうので、
文字コード変換しなければならないと思います。
 String te=new String(request.getParameter("te1").getBytes("ISO-8859-1"), "Shift_JIS");
としてみたらどうでしょうか。
補足コメント
n_squirrel

お礼率 56% (9/16)

教えて頂いた通りにしたら文字化けせずに表示することはできました。
後で、このことについて本でよく調べてみました。
[TomcatのGETパラメータのデコード]という記事にこんなことが書いてありました。

--------------------------------------------------------------------------------------------------------------------------------

 Tomcat5では、GETで送られるアドレス部のURL文字列のデコードに、必ずISO8859-1が使われるため、
サーブレット中でSetCharacterEncoding()メソッドにより文字エンコーディングを指定しても、デフォルトではそれが無視されてしまいます。
 Tomcatが悪いわけではありませんが、以前のバージョンのTomcatと振る舞いが異なるため混乱の原因となっています。

このデフォルト値を変更するには、以下の場所にあるserver.xmlを編集する必要があります。

<Tomcatをインストールしたディレクトリ>/conf/server.xml

server.xmlを開いたら、次の記述を追加します。
useBodyEncodingForURIの設定(80行目付近)
<conector port="8080" ・・・・・・・UseBodyEncodingForURI="true"/>

server.xmlはTomcatの動作を設定するためのファイルです。
UseBodyEncodingForURI="true"を指定することで、
URLデコード時にsetCharacterEncoding()メソッドで指定した文字エンコーディングが使われます。
この設定を行った後、Tomcatを再起動して、再び実行すれば文字化けせずに表示されます。

補足::
・POSTリクエストの場合はこの設定を行わなくても文字化けしません。
これはPOSTではGETと違ってパラメータをURLの一部として送信しないからです。
・サーブレットAPIの将来のリリースではsetCharacterEncoding()メソッドのエンコーディングがアドレス部分に適用されると
明記されるようになる予定なので、この設定を行うのが今のところベターな対処だと考えられます。

[COLUM]
getBytes()のnew String()
setCharacterEncoding()メソッドはサーブレットAPI2.3で導入されました。
それより前には以下のように自前でエンコーディングを行う必要がありました。

String message = request.getParameter("message");
message =new String(message.getBytes("ISO8859-1"),"Shift_JIS");

古い資料を見るとこのようなサンプルソースもあるかもしれませんが、現在はあまり利用されません。

--------------------------------------------------------------------------------------------------------------------------------

以上のような記述が本に書いてありましたが、POSTではなくGETパラメータであるということと、
server.xmlの設定をしていなかったことがいけなかったようです。

 そのようなことは基本的なことなのかもしれませんが知らないことがたくさんあり、まだまだ勉強することがいっぱいありそうです。
いろいろ調べるきっかけになり勉強になりました。
ありがとうございました。
投稿日時 - 2008-10-23 04:01:29
お礼コメント
n_squirrel

お礼率 56% (9/16)

ありがとうございます。
osumitanさんのおっしゃるとおりにしてみたら、一発で直りました。
すぐにちゃんと出来たので感激しています。
すごいですね、私もちゃんとそういう仕組みを理解してきちんと作れるように頑張りたいです。
ほんとうにありがとうございました。
投稿日時 - 2008-10-20 03:09:37
  • 回答No.1
レベル11

ベストアンサー率 58% (126/214)

クライアント側(ブラウザ側)のエンコーディングに統一して下さい。
補足コメント
n_squirrel

お礼率 56% (9/16)

charset=Shift_JIS
request.setCharacterEncoding("Shift_JIS");
response.setCharacterEncoding("Shift_JIS");
にしみても、
charset=Windows-31J
request.setCharacterEncoding("Windows-31J");
response.setCharacterEncoding("Windows-31J");
にしみても、状況としては変わりませんでした。

charset=EUC-JP
request.setCharacterEncoding("EUC-JP");
response.setCharacterEncoding("EUC-JP");
にすると自分の手のパラメータ以外もすべてまったく解読不能な文字化けになってしまいます。

たぶん、IE7(Shift_JIS)でもSleipnir(EUC-JP)だと思うのですが、いろいろ試してみたり他のPCでもやってみましたが同様でした。

全部で4つファイルがあるのですが、文字数制限で3つしか書けなかったので追記します。

<%@
page language="java" import="java.lang.*, java.util.*"
contentType="text/html; charset=Shift_JIS"
%>
<jsp:useBean id="hoge" scope="request" class="beans.JankenBean"/>

<html>
<head>
<title>じゃんけんの結果は?</title>
</head>
<body>
<h4>あなたが選んだ手は・・・</h4><jsp:getProperty name="hoge" property="jibun" />
<img src=<%=hoge.getJgazou()%>>
<p>
<h4>コンピュータが選んだ手は・・・</h4><jsp:getProperty name="hoge" property="computer" />
<img src=<%=hoge.getCgazou()%>>
<p>
<h2>勝負の結果は・・・</h2><jsp:getProperty name="hoge" property="hantei" />
<p>
<a href="JSP/JankenStart.jsp">もう一度勝負</a>
</body>
投稿日時 - 2008-10-19 18:11:21
このQ&Aで解決しましたか?
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


専門家があなたの悩みに回答!

-PR-

ピックアップ

-PR-
ページ先頭へ