Tomcat6.0で日本語が?に文字化けしてしまう原因とは?

このQ&Aのポイント
  • Tomcat6.0で日本語や2バイト文字が文字化けしてしまう原因を解説します。
  • IEの画面でHelloWorld!!が?????????と表示される現象の原因と解決方法について詳しく説明します。
  • JavaのサーブレットでHelloWorldを表示する際、文字化けが発生する場合の対処法を解説します。
回答を見る
  • ベストアンサー

Tomcat6.0 日本語が?に文字化け

HelloWorld!!はろぅわーるど!! と書いてコンパイルすると、IEの画面で HelloWorld!!????????? と表示されます。 日本語というよりは2バイト文字が文字化けしているのかなと思います。 何が足りないのでしょうか。 どなたかよろしくお願いします。 全文はこんな感じです。 import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloWorld extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { PrintWriter out = response.getWriter(); out.println("<html>"); out.println("HelloWorld!!はろぅわーるど!!"); out.println("</html>"); out.close(); } }

質問者が選んだベストアンサー

  • ベストアンサー
noname#33813
noname#33813
回答No.2

>out.println("HelloWorld!!縺ッ繧阪≦繧上?繧九←??シ?); >警告:この文字は、エンコーディング MS932 にマップできません というエラーがでるということは コンパイルはMS932(いわゆるWindowsのShift_JIS)で行われているようです。 となると、 >UTF-8で保存って、そもそもどうしたら良いのでしょうか。。 UTF-8というよりMS932で保存されていれば化けないように思います。 で、よくよく考えてみたのですが、 Servletでキャラクタセットを指定していないために out.printlnの送出が正しい文字コードで行われていない気がしてきました。 保存や、コンパイルは元のままで結構ですので 試しに下記一文を response.setContentType("text/html; charset=Windows-31J"); >PrintWriter out = response.getWriter(); の上あたりに加えてみて頂けますか。 おそらくこれで上手くいくと思います。

-Jelly-
質問者

お礼

できませんでした! と思ったらTomcat再起動してませんでした。 無事表示されました! 本当にありがとうございます。 実はエクリプスと一緒に使っていて、 その辺の連携ができてないんじゃないかとか バージョンの相性があるのかとか そもそもインストールが間違ってるんじゃとかいろいろ考えました。 (インストールするだけの段階でかなり挫折気味でした・・・) ツールって便利ですけどたくさん使うとどこでダメになってるのか分かりませんね(笑 むっちゃめんどくさかったけど楽しーですね

その他の回答 (1)

noname#33813
noname#33813
回答No.1

・javaファイルの文字コードとコンパイル時の文字コードが異なっている ・コンパイルは正しく行われているが、レスポンスヘッダもしくはMETAタグでキャラクタセットを指定していないためにIEが文字コードを正しく解釈していない →こちらはIEメニューバーの「表示」→「エンコード」で「シフトJIS」「EUC」「Unicode(UTF-8)」あたりをやってみれば良いでしょう。 これで何れも化けるのでしたら、先にあげたコンパイル時点での文字コード指定が誤っているのだと思います。

-Jelly-
質問者

お礼

IEからエンコードしましたが、変わりませんでした。 コンパイルは正常終了します。 IEでのソースが <html> HelloWorld!!????????? </html> となっていました。 IE側での問題ではなさそうですね。 どうもありがとうございます。 >javaファイルの文字コードとコンパイル時の文字コードが異なっている 多分こちらが問題なのかなと思います。 確かに、通常のメモ帳ってSJISですよね。 そこで、UTF-8に変換してから上書き保存しました。 文字が化けましたが・・・。 out.println("HelloWorld!!縺ッ繧阪≦繧上?繧九←??シ?); 警告:この文字は、エンコーディング MS932 にマップできません とコンパイルエラーが出ました(当然?) UTF-8で保存って、そもそもどうしたら良いのでしょうか。。 メモ帳はsakuraを愛用しております。 http://members.at.infoseek.co.jp/sakura_editor/snapshot.html あまり好きではないのですが、 秀丸も少しだけ使ったことあります。 申し訳ありませんが、よろしくお願いします。

関連するQ&A

  • サーブレット初歩に関して。

    package oty; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class Otys */ public class Otys extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public Otys() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub } } 初期状態がこんな状態なんですが、これになにを追加したらhelloworldとでますか?? 普通にJAVA入門みたいに、System.out.printlnしたらいいんでしょうか??

    • ベストアンサー
    • Java
  • サーブレットのコンパイルについて

    はじめまして。 学校の課題の方でJSP/サーブレットをやっているのですが、サーブレットのコンパイルが通りません。 プログラムとエラーと環境変数は以下の通りです。 【プログラム】 import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloServlet extends HttpServlet { public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException { printWriter out = response.getWriter(); out.println("hello"); } } 【エラー】 HelloServlet.java:2: パッケージ javax.servlet は存在しません。 import javax.servlet.*; ^ HelloServlet.java:3: パッケージ javax.servlet.http は存在しません。 import javax.servlet.http.*; ^ HelloServlet.java:5: シンボルを解決できません。 シンボル: クラス HttpServlet 場所 : HelloServlet の クラス public class HelloServlet extends HttpServlet ^ HelloServlet.java:7: シンボルを解決できません。 シンボル: クラス HttpServletRequest 場所 : HelloServlet の クラス public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException ^ HelloServlet.java:7: シンボルを解決できません。 シンボル: クラス HttpServletResponse 場所 : HelloServlet の クラス public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException ^ HelloServlet.java:7: シンボルを解決できません。 シンボル: クラス ServletException 場所 : HelloServlet の クラス public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException ^ HelloServlet.java:9: シンボルを解決できません。 シンボル: クラス printWriter 場所 : HelloServlet の クラス printWriter out = response.getWriter(); 【環境変数】 CATALINA_HOME C:\servletbook\apache-tomcat CLASSPATH %CATALINA_HOME%\common\lib\jsp-api.jar;%CATALINA_HOME%\webapps\atmarkit\WEB-INF\classes;%CATALINA_HOME%\common\lib\servlet-jsp.jar; よろしくお願いします。

  • このソースのコンパイルできません。

    java, サーブレット初心者でコンパイルできません。エラーは以下のとおりです。 初歩的な質問で申し訳ないですがよろしくお願いします。 http://www.javaroad.jp/opensource/js_tomcat2.htm のページのHelloServlet.javaをコピーしてコンパイルをしようとしたらエラーが、、、。 import java.io.*; import java.text.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<HTML>"); out.println("<BODY>"); out.println(new java.util.Date()); out.println("</BODY>"); out.println("</HTML>"); } } ーーーーーーーーーーーーーーーーーーーーーーーーーーー HelloServlet.java:7: エラー: パッケージjavax.servletは存在しません import javax.servlet.*; ^ HelloServlet.java:8: エラー: パッケージjavax.servlet.httpは存在しません import javax.servlet.http.*; ^ HelloServlet.java:10: エラー: シンボルを見つけられません public class HelloServlet extends HttpServlet { ^ シンボル: クラス HttpServlet HelloServlet.java:11: エラー: シンボルを見つけられません public void doGet(HttpServletRequest request, ^ シンボル: クラス HttpServletRequest 場所: クラス HelloServlet HelloServlet.java:12: エラー: シンボルを見つけられません HttpServletResponse response) ^ シンボル: クラス HttpServletResponse 場所: クラス HelloServlet HelloServlet.java:13: エラー: シンボルを見つけられません throws IOException, ServletException { ^ シンボル: クラス ServletException 場所: クラス HelloServlet エラー6個 エラー

    • ベストアンサー
    • Java
  • サーブレットについて

    こんにちは。 サーブレットに質問したいことがあります。 以下のサンプルソースで、 response.setContentType("text/html;charset=Shift_JIS"); の部分があるのですが、このようにすると日本語が文字化けしてしまいます。 ちなみにresponse.setContentType("text/html); とすると、日本語も文字化けせずに正しく表示されます。 ここで質問なのですが、 サーブレットの場合はJSPと違い、charsetを指定しなくてもよろしいのでしょうか? 何か分かることがありましたらご教授御願い致します。 ---------☆サンプルソース(HelloWorldExample.java)☆---------------- import java.io.*; import java.text.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloWorldExample extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/html;charset=Shift_JIS"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title>ハローワールド</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>HelloWorld ハローワールド</h1>"); out.println("</body>"); out.println("</html>"); out.close(); } } ---------------------------------------------------

    • ベストアンサー
    • Java
  • Fedora10でHelloWorld.javaをコンパイル

    すると以下のようにエラーがでます。 何が原因でしょうか? /root/HelloWorld.java: import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloWorld extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title>Hello World!</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>Hello World!</h1>"); out.println("</body>"); out.println("</html>"); } } [root@prime ~]# javac -classpath /usr/share/tomcat6/lib/tomcat6-servlet-2.5-api-6.0.18.jar HelloWorld.java ---------- 1. WARNING in HelloWorld.java (at line 5) public class HelloWorld extends HttpServlet { ^^^^^^^^^^ The serializable class HelloWorld does not declare a static final serialVersionUID field of type long ---------- 1 problem (1 warning) [root@prime ~]# ただし、 /usr/share/tomcat6/lib/tomcat6-servlet-2.5-api-6.0.18.jar に使用したapiクラスは含まれています。 The serializable class HelloWorld does not declare a static final serialVersionUID field of type long の意味を教えてください。

    • ベストアンサー
    • Java
  • 干支の計算で。。。

    jspの"year"パラメータから生年を受け取って干支を表示するプログラムなのですが、 計算(year + 8)%12の所でなぜ「+8」をするのか分かりません。 技術的といいますか算数レベルの問題ですが どなたかご教授をお願いいたします。 ちなみに自分なりの考えだと紀元前1年が申にあたるからでしょうか? だとしても何かスッキリしません。 宜しくお願いいたします。 import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class EtoServlet extends HttpServlet{ //インデントしてなく見難いですが・・・。すみません。。。。 private final String [] ETOS = {"子","丑","寅","卯","辰","巳","午", "未","申","酉","戌","亥"}; public void doGet(HttpServletRequestrequest,HttpServletResponse response) throws IOException, ServletException{ String yearStr = request.getParameter("year"); int year = Integer.parseInt(yearStr); int index = (year + 8) % 12; String etoText = ETOS[index]; response.setContentType("text/plain;charset=Shift_JIS"); PrintWriter out = response.getWriter(); out.println("あなたの干支は "+etoText + "デス"); } }

    • ベストアンサー
    • Java
  • javaservletの質問

    package test; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; @WebServlet(urlPatterns={"/test/Test2"}) public class Test2 extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(false); // セッションを取得(新しいセッションを作成しないようにする) if (session != null) { response.getWriter().write("yes, World!"); // クライアントにテキストを出力 } else { response.getWriter().write("no, World!"); // クライアントにテキストを出力 } } }sessionがある場合にはyesを、無い場合にはnoを出力したいのですが必ずyesになってしまいます。 HttpSession session = request.getSession(false); でsessionがない場合には作成しないようにしているはずなのになぜでしょうか

  • ディスパッチャー処理の流れについて

    ************************** package dispa; import java.io.IOException; import javax.servlet.*; import javax.servlet.RequestDispatcher; import javax.servlet.http.*; public class Action extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException { int flag=0; request.setAttribute("error", "エラーです"); ServletContext sc = getServletContext(); if (flag == 1) { request.setAttribute("count","1"); RequestDispatcher disp = sc.getRequestDispatcher("/servlet/dispa.Login"); disp.forward(request,response); return; } // コンソールコメント1 ここから System.out.println("Action if文の外"); System.out.println(flag); // コンソールコメント1 ここまで RequestDispatcher disp = sc.getRequestDispatcher("/servlet/dispa.Entry"); disp.forward(request,response); // コンソールコメント3 ここから System.out.println("Action Dispatch処理終了ライン"); // コンソールコメント3 ここまで } } ************************** package dispa; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class Entry extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException { response.setContentType("text/html;charset=Shift_JIS"); PrintWriter out=response.getWriter(); String errorMSG = (String)request.getAttribute("error"); out.println(errorMSG); // コンソールコメント2 ここから System.out.println("Entry エラー"); // コンソールコメント2 ここまで } } ************************** package dispa; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class Login extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException { response.setContentType("text/html;charset=Shift_JIS"); PrintWriter out=response.getWriter(); String Logcount = (String)request.getAttribute("count"); out.println("Login"); // コンソールコメント4 Login ここから System.out.println("Login内"); // コンソールコメント4 Login ここまで if (Logcount.equals("1") ) { out.println("1回目のログインです"); return; } } } Action からスタート int flag=0 のときにはif文は実行されず コンソールコメント1 を表示 ディスパッチャーで Entry へ行き コンソールコメント2 を表示 その後 コンソールコメント3 を表示 [END] [質問1] なぜ、Entryサーブレットへ行ったとき、そこには return などの記述はないのに (元の)Actionへ戻るのか? -------------------------------- int flag=1 と可変して同じくAction からスタート flag=1 のときにはif文は実行され count を 1 にセット ディスパッチャーで Login へ行き コンソールコメント4 を表示 Logcount ←count にて 1なら 「1回目のログインです」 return [質問2] なぜ、Loginサーブレットへ行ったとき、そこに わざわざ return の記述をしてるのに (元の)Actionへ戻らないのか? この2つの質問です よろしくお願いします。

  • サーブレットからBeanに

    こんにちは areaフォルダに AreaServlet 、GetterServlet beanフォルダに FirstBean ============================== package area; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class AreaServlet extends HttpServlet { private static final String CONTENT_TYPE = "text/html; charset=Shift_JIS"; public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { String info="滋賀県"; bean.FirstBean fiBe = new bean.FirstBean(); fiBe.setZip(info); response.setContentType(CONTENT_TYPE); PrintWriter out=response.getWriter(); out.println("<html>"); out.println("<head><title>BeanServlet</title></head>"); out.println("<body>"); out.println("FirstBeanにセットされたデータ:" + fiBe.getZip() ); out.println("<p><a href=\"/jspbean2/servlet/area.GetterServlet\">Bean確認用</a>"); out.println("</body></html>"); } } ============================== package area; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class GetterServlet extends HttpServlet { private static final String CONTENT_TYPE = "text/html; charset=Shift_JIS"; public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { response.setContentType(CONTENT_TYPE); PrintWriter out=response.getWriter(); bean.FirstBean fiBe = new bean.FirstBean(); out.println("FirstBeanにセットされたデータ:" + fiBe.getZip() ); } } ============================== package bean; public class FirstBean { private String zip; //Setterの定義 public void setZip(String newZip) { zip = newZip; } //Getterの定義 public String getZip() { return zip; } } ============================== AreaServlet ではきちんと bean へ文字列を setし、また文字列を getしているようです。 その後 AreaServlet から GetterServlet へと移ったとき GetterServlet にも bean から文字列をgetしたいのに、どうしてか null が返ってgetできません??? どのようにしたら良いでしょうか? よろしくお願いします。

  • JSPからパラメータを取得してサーブレットに遷移する際文字化けしてしまいます。

    オールインワンEclipse3.4 tomcat5.5 上記の環境で、サーブレットの参考書に沿ってサンプルを作成していたのですが、パラメータボックスに日本語を入力すると文字化けしてしまい、ブラウザに日本語で表示することができません。 英文字では問題なく表示できるので、エンコード・デコードのどこかで間違っているのだと思うのですが、参考書に書いてあることを試しましても、うまくいきません。 どなたかご指導お願いいたします。 ---------- echo.jsp ---------- <%@page contentType="text/html; charset=Windows-31J"       pageEncoding="Windows-31J"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <body> <h2>EchoServletの入力</h2> <form action = "/basic2/EchoServlet2"> <input type="text" name="message"> <input type="submit" value="表示" > </form> </body> </html> --------------------- EchoEchoServlet2.java --------------------- package input; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class EchoServlet2 extends HttpServlet{ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ request.setCharacterEncoding("Windows-31J"); String msg = request.getParameter("message"); System.out.println("msg =" + msg);//確認用 //response.setContentType("text/plain; charset=Windows-31J"); PrintWriter out = response.getWriter(); System.out.println("out = " + out);//確認用 out.println("message=" + msg); } } -------------------------------- tomcatの保存されているserver.xml -------------------------------- <!-- Define a non-SSL HTTP/1.1 Connector on port 8080 --> <Connector port="8000" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" useBodyEncodingForURI="true"←ボディのエンコードを使う指定を追加しました /> よろしくお願いいたします。

    • ベストアンサー
    • Java