質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.92%

サーブレットで文字が「???」になってしまう。

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 20K+

remember

score 162

タイトルの通りです。おそらくエンコード処理がうまくいってないと思うのですが、どこをどう直したらいいのかわかりません。コードは参考書の通り書いています。

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class Sample2 extends HttpServlet{
    public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException{
        try{
            String tmp = request.getParameter("cars");
            String carname = new String(tmp.getBytes("8859_1"),"JISAutoDetect");

            response.setContentType("text/html; charset=Shift_JIS");

            PrintWriter pw = response.getWriter();
            pw.println("<html>\n"
                + "<head><title>\n" + carname
                + "</title></head>\n"
                + "<body><center>\n"
                + "<h2>\n" + carname + "</h2>\n"
                + carname
                + "のお買い上げありがとうございました。<br/>\n"
                + "</center></body>\n"
                + "</html>\n");
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}
<html>
<head><title>サンプル</title></head>
<body><center>
<img src="car.gif"/><br/>
<h2>ようこそ</h2>
<hr/>
お選びください。<br/>
<br/>
<form action="http://localhost:8080/YJK/servlet/Sample2" method="GET">
<input type="text"name="cars"/>
<input type="submit" value="送信"/>
</form>
</center></body>
</html>


Sample2.htmlの実行画面↓
イメージ説明
「乗用車」と入力して送信すると・・・↓
イメージ説明
"                       乗用車
 乗用車のお買い上げありがとうございました。"
となるはずなのですが、ご覧のとおり?????になってしまいます。どうすればいいのでしょうか。


追記
shanxia様の回答を参考に、class Sample2の

response.setContentType("text/html; charset=Shift_JIS");

response.setContentType("text/html;charset=UTF-8");

に変えてみたのですが、上手くいきませんでした…。ただ設定ファイルの方で
encoding="ISO-8859-1"
とあったので、そちらを
encoding="UTF-8"
としてみたところ、下図のようになりました。
イメージ説明
どうやら入力フォームの変換が上手くいってないようです。

Sample2.javaファイルは「UTF-8(BOMなし)」というコードだと思います。「UTF-8」にして
javac -encoding UTF8
でコンパイルしようとすると、一行目で「'\ufeff'は不正な文字です」というエラーが出てコンパイルできないのです。(BOMなしだとコンパイルできる)。

一応設定ファイルも載せておきます。

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">

    <display-name>YasaJava</display-name>
    <description>YasaJava</description>

        <servlet>
            <servlet-name>Sample</servlet-name>
            <servlet-class>Sample</servlet-class>
        </servlet>

        <servlet-mapping>
            <servlet-name>Sample</servlet-name>
            <url-pattern>/servlet/Sample</url-pattern>
        </servlet-mapping>

        <servlet>
            <servlet-name>Sample2</servlet-name>
            <servlet-class>Sample2</servlet-class>
        </servlet>

        <servlet-mapping>
            <servlet-name>Sample2</servlet-name>
            <url-pattern>/servlet/Sample2</url-pattern>
        </servlet-mapping>
</web-app>
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

レスポンスヘッダに、utf-8
ファイルを utf-8 で保存。
jsp の charset に utf-8

<head> の直後に <meta /> タグで charset="utf-8"
上記タグ以降に、日本語はきじゅつします。

head タグいぜんに、日本語を記述する場合、autodetect で判断されるので、
sjis のばあいは、
<!-- あ -->
というhtmlコメントを、html タグ直後に挿入、運がよければ、htmlコメント以降をsjisとして解釈してくれます。sjis で行くなら、javaファイル以外は、html、jsp、js、cssはsjisで保存してもokですが、2
バイト目が¥の文字が化けやすいのと、〜、が化けやすいのと、色々問題があるので、出た時修正すれば良いならそのままで、こんごのためにも、html,css,js,java,jsp,xmlなどのファイルはutf-8で記述するようにした方が無難です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/01/27 03:08

    回答ありがとうございます。3時間ぐらい色々いじってどうやっても上手くいかなかったんですが、一旦tomcatを止めて再起動させたところ、あっさり上手くいきました。これはどういうことなのでしょうか。

    キャンセル

  • 2016/01/27 10:48

    java はBOM ありutf-8ファイルを認識できません。windows メモ帳で編集、保存した場合、ファイルの先頭に目に見えないコードが入ります。これがバイトオーダーマーク、BOMです。サクラエディタでは、utf-8 保存時にオプションで bom有り無し設定が出来ますが、そもそもbom対応できてる編集ツールは結構あっても、コンパイラなどは想定してない文字と判断され易いので基本、絶対にBOM付きで保存しない、ルールにしておけば問題ないです。メモ帳は余程の事情が無い限り開発用途には使わない方が悩みが少し減ります。

    tomcat 再起動の件ですが、jboss じゃなくて、tomcat ですよね、起動して、2秒待てば使えませんか?tomcatでも、大抵のファイルは起動中のホットデプロイに対応していますが、幾つかの条件のとき、再起動しないとうまく修正結果が反映されないケースがありまづ。5分とか起動完了まで待つものではないので、横着せず、tomcat は基本的に「必ず再起動して使う」というスタンスで居てくれるといいですね。

    キャンセル

+1

response.setContentType("text/html; charset=UTF-8");
にすればどうでしょうか。

あと、Sample2.javaファイルの文字コードはUTF-8でしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/01/27 00:18

    回答ありがとうございます。質問を編集したので見ていただけないでしょうか。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る