- 締切済み
JSP/Servletのパラメータの受け渡しが文字化けしてうまくいきません。
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; } }
- n_squirrel
- お礼率56% (9/16)
- Java
- 回答数3
- ありがとう数8
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- osumitan
- ベストアンサー率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"); としてみたらどうでしょうか。
- _ranco_
- ベストアンサー率58% (126/214)
> だと思うのですが 「だと思う」で仕事をしてはいけません。 TomcatのデフォルトはUTF-8なので、なにもかもUTF-8に統一するのがいちばん楽ですよ。
![n_squirrel](https://gazo.okwave.jp/okwave/images/contents/av_nophoto_60_5.gif)
補足
私は初心者で、まだ仕事としてはやっていません。 もちろん、それを目指しているわけですが・・・。 自分で考え試行錯誤して作ってみたわけですが、初心者はこちらで質問してはいけませんか? ブラウザの表示のエンコードを見て判断したのですが、違っているのでしたらどのように調べるのか教えてください。 UTF-8にしてみましたが、やはり全体的に文字化けして更に酷くなってしまいます。 JSPのcharsetとServletのrequest.setCharacterEncoding()メソッドで統一するということですよね? 出来る限りのことはしてみたつもりですが、向いてないんでしょうか。
- _ranco_
- ベストアンサー率58% (126/214)
クライアント側(ブラウザ側)のエンコーディングに統一して下さい。
![n_squirrel](https://gazo.okwave.jp/okwave/images/contents/av_nophoto_60_5.gif)
補足
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>
関連するQ&A
- プログラミング(JAVA)について
2つほど質問があります。どなたか回答していただける方がいたらお願いします。 1、以下のじゃんけんゲームのプログラムを作成したのですがfor文を用いてコードを短くするにはどうすればいいですか? class jyanken { public static void main(String[] args) { int x = 0, y = 0; if (args[0].equals("グー")) { x = 0; } else if (args[0].equals("チョキ")) { x = 1; } else if (args[0].equals("パー")) { x = 2; } else { System.out.println("エラー"); } y = (int)(Math.random() * 10.0) % 3; if (x == 0) { if (y == 0) { System.out.println("あいこ"); } else if (y == 1) { System.out.println("勝ち"); } else if (y == 2) { System.out.println("負け"); } } else if (x == 1) { if (y == 1) { System.out.println("あいこ"); } else if (y == 2) { System.out.println("勝ち"); } else if (y == 0) { System.out.println("負け"); } } else if (x == 2) { if (y == 2) { System.out.println("あいこ"); } else if (y == 0) { System.out.println("勝ち"); } else if (y == 1) { System.out.println("負け"); } } } } 2、もう1パターンでじゃんけんプログラムを作成しようと考えているのですが。上手くできないので参考のファイルを掲示してもらえると嬉しいです。 機能としては、for文とif文を使用して。プログラムの起動と同時に、コンピュータがグー、チョキ、パーをランダムに出す(プレーヤに見せない) 次に人がグー、チョキ、パー何を出すかをキーボードで入力して最後にプログラムが出したものとコンピュータがランダムに出したものと比較し、勝負を表示する。といった感じです。
- 締切済み
- Java
- C#の配列について
0回答 C#の配列について 現在C#のジャンケンゲームの作成に取り組んでいます。 ユーザーの入力した数値に対して出す手を 1:グー2:チョキ3:パー という形にしたいのですが 0:グー1:チョキ2:パー という形になってしまいます。 コンピューターの出す手も 1~3ではなく0~2しか出さない状況で、どなたか修正方法を教えて頂けないでしょうか? 【ソースコード】 //コンピュータと自分の入力した手を判別するメソッド static void Janken(ref string myHand) { // Random クラスの新しいインスタンスを生成する Random ran = new System.Random(); //コンピュータの出す手を1以上3以下に設定する。 string[] com = new string[] { "1", "2", "3" }; string con = ran.Next(3).ToString(); //配列型、変数teに出す名前を設定 string[] te = { "グー", "チョキ", "パー" };
- ベストアンサー
- C・C++・C#
- javaじゃんけんゲーの質問
このjavaじゃんけんゲームで 0を押すまでじゃんけんが続いて0押したら終了して、終了と表示して、じゃんけんの勝敗が表示されるように作りたいんですけどどうしたらいいですか?教えてください import java.io.*; class kadai6 { public static void main(String args[]) throws IOException { System.out.println("これは、じゃんけんゲームです。"); System.out.println("あなたの手を入力して下さい。(1:グー、2:チョキ、3:パー、0:終了)さぁどれにしますか?"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); int res =Integer.parseInt(str); switch(res){ case 1: System.out.println("あなたの手はグーです。"); break; case 2: System.out.println("あなたの手はチョキです。"); break; case 3: System.out.println("あなたの手はパーです。"); break; default: System.out.println("あなたの入力した値はエラーです。1~3の値を入力してください。"); System.exit(1); break; } int comp = (int)(Math.random()*3) + 1; switch (comp){ case 1: System.out.println("コンピュータの手はグーです。"); break; case 2: System.out.println("コンピュータの手はチョキです。"); break; case 3: System.out.println("コンピュータの手はパーです。"); break; default: System.out.println ("エラーです。"); break; } switch (res -comp) { case -2: System.out.println("コンピュータの勝ちです。"); break; case -1: System.out.println ("あなたの勝ちです。"); break; case 0: System.out.println ("あいこです。"); break; case 1: System.out.println ("コンピュータの勝ちです。"); break; case 2: System.out.println("あなたの勝ちです。"); break; default: System.out.println ("エラーです。"); break; } } }
- 締切済み
- Java
- どこに・・・
import java.io.*; class janken { public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.print("あなたの手を入力して下さい。(1:グー、2:チョキ、3:パー)?\n"); String str = br.readLine(); int a = Integer.parseInt(str); switch(a){ case 1: System.out.println("あなたの手はグーです。"); break; case 2: System.out.println("あなたの手はチョキです。"); break; case 3: System.out.println("あなたの手はパーです。"); break; default: System.out.println("1~3を入力してください。"); break; } { int ran = ((int)(Math.random()*3)+1); int b=ran; switch(b){ case 1: System.out.println("コンピュータの手はグーです。"); break; case 2: System.out.println("コンピュータの手はチョキです。"); break; case 3: System.out.println("コンピュータの手はパーです。"); break; } int c; c=a-b; if(c == 2){ System.out.println("勝ち"); } else if(c== -1){ System.out.println("勝ち"); } else if(c==0){ System.out.println("あいこ"); } else if(c==1){ System.out.println("負け"); } else { System.out.println("負け"); } } } } いまjavaの勉強をしており、練習をかてね上のようにじゃんけんのプログラムを書きました。今の段階で、一様動くのですが、一回ごとにじゃんけんが終了されてしまいます。そこで繰り返し文のwhile(a != x)を使って数値を入力したら終了するように考えているんですが、whileをどこに入れたらいいのかがわかりません・・・ 自分でいろんなところに入れて試して見たんですが、無限ループになったりして、終了してくれません。どこにwhileを入れたらいいのでしょうか?それてもwhileじゃないほうがいいのでしょうか?アドバイスお願いします。
- ベストアンサー
- Java
- 例外処理
import java.io.*; class janken { public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int k=0,m=0,h=0,z=0; while(true){ System.out.print("あなたの手を入力して下さい。(1:グー、2:チョキ、3:パー、0:終了)?\n"); String str = br.readLine(); int a = Integer.parseInt(str); if(a == 0){ break; } z++; switch(a){ case 1: System.out.println("あなたの手はグーです。"); break; case 2: System.out.println("あなたの手はチョキです。"); break; case 3: System.out.println("あなたの手はパーです。"); break; default: System.out.println("1~3を入力してください。"); break; } { int ran = ((int)(Math.random()*3)+1); int b=ran; switch(b){ case 1: System.out.println("コンピュータの手はグーです。"); break; case 2: System.out.println("コンピュータの手はチョキです。"); break; case 3: System.out.println("コンピュータの手はパーです。"); break; } int c; c=a-b; if(c == 2){ System.out.println("あなたの勝ちです。"); k++; } else if(c== -1){ System.out.println("あなたの勝ちです。"); k++; } else if(c==0){ System.out.println("あいこです。"); h++; } else if(c==1){ System.out.println("コンピュータの勝ちです。"); m++; } else { System.out.println("コンピュータの勝ちです。"); m++; } } } System.out.println("じゃんけん終了。"); System.out.println("あなたは"+z+"試合中、"+k+"勝"+m+"敗"+h+"分けです"); } } このようにじゃんけんのプログラムを作りました。 しかし0~3以外の数字が入力されても、じゃんけんの勝敗を勝手に判定してしまいます・・・ try文でやってみたのですがいまいちうまくいきませんでした。 0~3を入力したら入力エラーと表示して、ふたたびユーザーの手を聞くようにしたいです。 どうすればよいかアドバイスお願いします。
- ベストアンサー
- Java
- C#のループについて
現在C#でジャンケンゲームの課題に取り組んでいるのですが、ループ処理や各メソッドに対しての変数にエラーがでてしまい、修正方法が分からず、どなたか教えて頂けないでしょうか? ・ユーザはグー、チョキ、パーをそれぞれ1、2、3の数字で入力する。 ・CPUは乱数を使って出す手を選ぶ。 ・5回勝負として、人間とコンピュータの勝った回数を数え、勝敗がつくたびに1回ずつ表示する。 あいこは決着がつくまで再勝負。途中でどちらかが3勝しても、5回最後まで勝負を続ける。 ・指定された範囲以外の値を入力したら負けにする 【実行例】 ユーザ名を入力してください:goto 手を入力してください(グー1、チョキ2、パー3): 1 CPU:チョキ WIN goto:1勝、CPU:0勝 手を入力してください(グー1、チョキ2、パー3): 3 CPU:パー DRAW 手を入力してください(グー1、チョキ2、パー3): 3 CPU:チョキ LOSE goto:1勝、CPU:1勝 手を入力してください(グー1、チョキ2、パー3): 0 LOSE(反則負け) goto:1勝、CPU:2勝 (中略) goto:3勝、CPU:2勝 gotoさんの総合勝利です! using System; namespace Ensyuu007 { static class Program { static string? Myhand; static int CntWin = 0; //勝利回数 static int CntLose = 0; //敗北回数 static int CntDraw = 0; //引分回数 //ユーザー名の入力 static void Main(string[] args) { string EnterName = Console.ReadLine(); Console.WriteLine("ユーザ名を入力してください: {0}", EnterName); Console.ReadLine(); } //じゃんけんを5回行います。 for (int GameCnt = 0; GameCnt <= 5; GameCnt++) { //正しく入力されたかチェックを行うメソッド。 static string Check(ref string Myhand) { static = Console.ReadLine(); Console.WriteLine("手を入力してください(グー1、チョキ2、パー3):{0}", Myhand); //正しく入力されたかチェックします。 Check(ref Myhand); //0,1,2が入力された場合 if (Myhand.Equals("1") || Myhand.Equals("2") || Myhand.Equals("3")) { //入力した数字をそのまま返します。 return Myhand; } //1,2,3以外が入力された場合 else { Console.WriteLine("LOSE(反則負け)"); return Myhand; } } //じゃんけんを開始するメソッド。 static void Start() { //コンピューターとじゃんけんさせます。 Janken(ref Myhand); Console.ReadLine(); } //コンピュータと自分の入力した手を判別するメソッド static void Janken(ref string Myhand) { // Random クラスの新しいインスタンスを生成する Random ran = new System.Random(); //コンピュータの出す手を1以上3以下に設定する。 string[] com = new string[] { "1", "2", "3" }; string con = ran.Next(3).ToString(); //配列型、変数teに出す名前を設定 string[] te = { "グー", "チョキ", "パー" }; //コンピュータが勝利した場合 if (((Myhand == "1") && (con == "3")) || ((Myhand == "2") && (con == "1")) || ((Myhand == "3") && (con == "0"))) { Console.WriteLine("あなた:" + te.GetValue(int.Parse(Myhand))); Console.WriteLine("コンピュータ:" + te.GetValue(int.Parse(con))); Console.WriteLine("LOSE"); CntLose++; //敗北回数に加算 } //自分が勝利した場合 else if (((Myhand == "1") && (con == "2")) || ((Myhand == "2") && (con == "3")) || ((Myhand == "3") && (con == "1"))) { Console.WriteLine("あなた:" + te.GetValue(int.Parse(Myhand))); Console.WriteLine("コンピュータ:" + te.GetValue(int.Parse(con))); Console.WriteLine("WIN"); CntWin++; //勝利回数に加算 } //あいこだった場合 else { Console.WriteLine("あなた:" + te.GetValue(int.Parse(Myhand))); Console.WriteLine("コンピュータ:" + te.GetValue(int.Parse(con))); Console.WriteLine("DRAW"); CntDraw++; //引分回数に加算 } } } static void Resurut() { if (CntWin > CntLose) { Console.WriteLine("総合勝利です"); } else if (CntLose < CntWin) { Console.WriteLine("CPUの総合勝利です"); }
- ベストアンサー
- C・C++・C#
- PHPでじゃんけん勝負
PHPでじゃんけん勝負ができるプログラムを作成しました。ラジオボタンから選択した値(「グー」あるいは「チョキ」あるいは「パー」)をPOSTで送信し、ユーザと相手(コンピュータ)が選んだ手と、じゃんけんの勝敗を表示します。ラジオボタンで選択をしなくても最初からあいこが表示された状態になります。どの部分を修正すればいいですか ? <?php $arry_hand = array('グー', 'チョキ', 'パー'); $me = ''; //取得したい3つ(グー、チョキ、パー)をそれぞれ定義して、文字列を初期化する $you = ''; $result = ''; if (isset($_POST['hand']) === TRUE) { $me = htmlspecialchars($_POST['hand'], ENT_QUOTES, 'UTF-8'); $you = $arry_hand[array_rand($arry_hand)]; } //最初からあいこが表示された状態になる if ($me === $you) { $result = 'あいこ'; } else if ($me === 'グー' && $you === 'チョキ' || $me === 'チョキ' && $you === 'パー' || $me === 'パー' && $you === 'グー') { $result = '勝ち'; } else{ $result = '負け'; } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>じゃんけん</title> </head> <body> <h1>じゃんけん勝負</h1> 自分: <?php print $me; ?><br> 相手: <?php print $you; ?><br> 結果: <?php print $result; ?><br> <form method="post"> <label><input type="radio" name="hand" value="グー" <?php if ($me === 'グー') { print "checked";} ?> >グー</label> <label><input type="radio" name="hand" value="チョキ" <?php if ($me === 'チョキ'){ print "checked";} ?> >チョキ</label> <label><input type="radio" name="hand" value="パー" <?php if ($me === 'パー'){ print "checked";} ?> >パー</label> <input type="submit" value="勝負!!" > </form> </body> </html>
- 締切済み
- PHP
- JSPでの文字化け
こんにちは。 今JAVAを勉強中でJSPファイルを作成しています。 test.jsp <%@ page language="java" contentType="text/html; charset=Windows-31J" pageEncoding="Windows-31J"%> <HTML> <HEAD><TITLE>文字表示テスト</TITLE></HEAD> <BODY> <% String text = request.getParameter("text"); if (text != null) { if (!text.equals("")) { out.println("画面からの文字<BR>"); out.println(text); } } %> <FORM NAME="testForm" METHOD="post" ACTION="test.jsp"> <TEXTAREA NAME="text"></TEXTAREA> <INPUT TYPE="submit" VALUE="送信"> </FORM> </BODY> </HTML> Windowsで上のプログラムを実行すると問題なく表示されますが Linuxサーバで実行すると???となってしまいます。
- ベストアンサー
- Java
- グーとグーで「あいこ」と表示されない。
現在javaを勉強中でして、じゃんけんゲームを作成しているのですが、 出力のところで本来グーとグーで「あいこ」と表示されるはずなんですが、表示されなかったり、「相手側の勝ち」と表示されたりして、本来の表示がうまくできません。ソースコードを見ても間違っているようには見えないのですがどこか間違っていますか? ちなみにNetBeansを使用しております。よろしくお願いします。 /* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package jyanken1; */ import java.io.*; import java.lang.invoke.MethodHandles; import java.util.Random; import jdk.nashorn.internal.runtime.regexp.joni.EncodingHelper; class Jyanken1 { /** * @param args the command line arguments */ public static void main (String[] args) throws IOException{ // TODO code application logic here String nyuuryoku; int nyuuryokuyou1; int sentouhyou; System.out.println ("じゃんけんゲームを始めます"); System.out.println ("0.グー 1.チョキ 2.パー"); BufferedReader nyuryokuyou = new BufferedReader (new InputStreamReader (System.in)); Random rnd = new Random(); nyuuryoku=nyuryokuyou.readLine (); nyuuryokuyou1=Integer.parseInt (nyuuryoku); while (nyuuryokuyou1 >=3){ System.out.println ("エラーです。もう一度入力しなおしてください"); System.out.println ("0.グー 1.チョキ 2.パー"); nyuuryoku=nyuryokuyou.readLine (); nyuuryokuyou1=Integer.parseInt (nyuuryoku); } switch(nyuuryokuyou1){ case 0: System.out.println ("自分側:グー"); break; case 1: System.out.println ("自分側:チョキ"); break; case 2: System.out.println ("自分側:パー"); break; } int ran = rnd.nextInt(2); switch(ran){ case 0: System.out.println ("cp:グー"); break; case 1: System.out.println ("cp:チョキ"); break; case 2: System.out.println ("cp:パー"); break; } if((nyuuryokuyou1==0&&ran==1)&&(nyuuryokuyou1==1&&ran==2)&&(nyuuryokuyou1==2&&ran==0)){ System.out.println ("自分側の勝ち"); }else if((nyuuryokuyou1==0&&ran==2)&&(nyuuryokuyou1==1&&ran==0)&&(nyuuryokuyou1==2&&ran==1)){ System.out.println ("相手側の勝ち"); }else if ((nyuuryokuyou1==0&&ran==0)&&(nyuuryokuyou1==1&&ran==1)&&(nyuuryokuyou1==2&&ran==2)) { System.out.println ("あいこです。"); } } }
- ベストアンサー
- Java
- PHPでじゃんけん勝負
じゃんけん勝負ができるプログラムを作成しました。ラジオボタンから選択した値 (「グー」あるいは「チョキ」あるいは「パー」)をPOSTで送信し、ユーザと相手(コンピュータ)が 選んだ手と、じゃんけんの勝敗を表示するというプログラムです。 エラーはありませんが、下記のプログラム以外にシンプルなプログラムがあれば教えてください。 <?php $janken = array('グー', 'チョキ', 'パー'); $result = ''; $me = ''; $com = ''; // $_POST['hand']が存在するか確認するのにissetを使う。$_POST['hand']を使いたいのであれば必ず必要 if (isset($_POST['hand']) === TRUE) { $me = htmlspecialchars($_POST['hand'], ENT_QUOTES, 'UTF-8'); $com = $janken[array_rand($janken)]; } if ($me === '' || $com === '') { $result = ''; //データがない時の処理 print '下の3つの中からどれかを選択してください'; } else if ($me === $com) { $result = 'あいこ'; } else if ($me === 'グー' && $com === 'チョキ' || $me === 'チョキ' && $com === 'パー' || $me === 'パー' && $com === 'グー') { $result = '勝ち'; } else { $result = '負け'; } ?> <!DOCTYPE HTML> <html lang="ja"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <form method ="post"> <h1>じゃんけん勝負</h1> <p>自分:<?php print $me; ?></p> <p>相手:<?php print $com; ?></p> <p>結果:<?php print $result; ?></p> <!--php if ($hand === 'グー'){ print 'checked';} もしhandがグーであるなら、チェックボックスにチェックを表示させる--> <!--これをすることにより直近で選んだものにチェックがされるので、連続でクリックするときに便利--> <label><input type="radio" name="hand" value="グー">グー</label> <label><input type="radio" name="hand" value="チョキ">チョキ</label> <label><input type="radio" name="hand" value="パー">パー</label> <p><input type="submit" value="勝負!"></p> </form> </body> </html>
- ベストアンサー
- PHP
お礼
ありがとうございます。 osumitanさんのおっしゃるとおりにしてみたら、一発で直りました。 すぐにちゃんと出来たので感激しています。 すごいですね、私もちゃんとそういう仕組みを理解してきちんと作れるように頑張りたいです。 ほんとうにありがとうございました。
補足
教えて頂いた通りにしたら文字化けせずに表示することはできました。 後で、このことについて本でよく調べてみました。 [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の設定をしていなかったことがいけなかったようです。 そのようなことは基本的なことなのかもしれませんが知らないことがたくさんあり、まだまだ勉強することがいっぱいありそうです。 いろいろ調べるきっかけになり勉強になりました。 ありがとうございました。