

サーブレットの初心者です。

今日はservletエンコードの勉強しています。

バイト列から文字列を作成する際に、文字化けの問題に遭いました。

OS : fedora28  
jdk : java10  
server : tomcat9  
IDE : eclipse4.8

以下はソースコードです。

**servlet :**

[code]

    package getBytes_fun;
    import java.io.IOException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class RequestSample2 extends HttpServlet {
        private static final long serialVersionUID = 1L;
    
    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
     *      response)
     */
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // TODO Auto-generated method stub
            response.setContentType("text/html; charset = UTF-8");
            response.getWriter().append("Served at: ").append(request.getContextPath());
            PrintWriter out = response.getWriter();
    
            String tmp;
            String name = "";
    
            tmp = request.getParameter("name");
            if (tmp == null || tmp.length() == 0) {
                name = "未制定";
            } else {
                name = decodeString(tmp);
            }
    
            int old;
            tmp = request.getParameter("old");
            if (tmp == null || tmp.length() == 0) {
                old = -1;
            } else {
                try {
                    old = Integer.parseInt(tmp);
                } catch (NumberFormatException e) {
                    // TODO: handle exception
                    old = -1;
                }
            }
    
            String tmps[] = request.getParameterValues("food");
            String food = "";
            if (tmps != null) {
                for (int i = 0; i < tmps.length; i++) {
                    food += decodeString(tmps[i]);
                    food += "";
                }
            } else {
                food = "ありません";
            }
    
            StringBuffer sb = new StringBuffer();
    
            sb.append("<html>");
            sb.append("<head>");
            sb.append("<title>サンプル</title>");
            sb.append("</head>");
            sb.append("<body>");
    
            sb.append("<p>お名前は ");
            sb.append(name);
            sb.append(" です</p>");
    
            sb.append("<p>年齢は ");
            if (old == -1) {
                sb.append("未設定です</p>");
            } else {
                sb.append(old);
                sb.append(" です</p>");
            }
    
            sb.append("<p>好きな果物は ");
            sb.append(food);
            sb.append(" です</p>");
            sb.append("</body>");
            sb.append("</html>");
    
            out.println(new String(sb));
    
            out.close();
        }
    
        protected String decodeString(String str) {
            // TODO Auto-generated method stub
            try {
                byte[] byteData = str.getBytes("ISO_8859_1");
                str = new String(byteData, "UTF-8");
            } catch (Exception e) {
                // TODO: handle exception
                return null;
            }
            return str;
        }
    }
    
[/code]

**html file :**

[code]

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    <p>アンケート調査です</p>
    <form action="/ERP/RequestSample2" method="get">
        <table>
            <tr>
                <td>氏名</td>
                <td><input type="text" size="20" value="" name="name"></td>
            </tr>
            <tr>
                <td>年齢</td>
                <td><input type="text" size="5" value="" name="old"></td>
            </tr>
            <tr>
                <td>好きな果物</td>
                <td><select name="food" size="3" multiple>
                        <option value="りんご">りんご</option>
                        <option value="メロン">メロン</option>
                        <option value="ぶどう">ぶどう</option>
                </select></td>
            </tr>
        </table>
        <input type="submit" name="button1" value="送信">
    </form>
    
[/code]

  

**プリントアウト結果:**

[![プリントアウト結果](https://i.stack.imgur.com/TDsAi.png)](https://i.stack.imgur.com/TDsAi.png)

ご教示お願い致します。


CC BY-SA 4.0
2018-09-05T02:23:00.533
48093
2019-06-05T04:05:45.617
2018-09-05T03:01:49.797
13007
13007
question
java html eclipse tomcat servlet
javaのservletのエンコードの問題です


decodeString()の問題です。  
decodeString()を削除したら問題なく表示できます。  
解決です。


CC BY-SA 4.0
2018-09-05T04:26:51.457
48102
2018-09-05T04:26:51.457
13007
48093
answer