setContentTypeでcharset=UTF-8を設定してもISO-8859-1になってしまう

java Java

HttpServletResponseのsetContentTypeメソッドでcharsetをUTF-8にしているにもかかわらず、実際にブラウザから見るとResponseHeaderのContent-typeはISO-8859-1となっており文字化けしてしまう。

修正前

servlet.java

public void doGet(HttpServletRequest req,
                  HttpServletResponse res) 
                  throws ServletException, IOException {
  // 略

    try (PrintWriter pw = res.getWriter()) {
      res.setContentType("text/html; charset=UTF-8");
      StringBuffer sb = new StringBuffer();
      //返却するHTMLの内容
      sb.append("<html>");
      // 略
      pw.println(new String(sb));
      pw.close();
    } catch (IOException e) {
      // 例外処理
    }
}

修正後

servlet.java

public void doGet(HttpServletRequest req,
                  HttpServletResponse res) 
                  throws ServletException, IOException {
  // 略

    res.setContentType("text/html; charset=UTF-8");
    try (PrintWriter pw = res.getWriter()) {
      StringBuffer sb = new StringBuffer();
      //返却するHTMLの内容
      sb.append("<html>");
      // 略
      pw.println(new String(sb));
      pw.close();
    } catch (IOException e) {
      // 例外処理
    }
}

まとめ

HttpServretRequestのgetWriterを呼び出す前に、charsetを指定しないと、
defaultのISO-8859-1が設定されてしまう。

すでに動いていたコードからコピペしたら、うまく行かなかったけどAPI仕様を見たらちゃんと書いてあった。
ServletResponse (Servlet 2.4 API 仕様)

安易なコピペはダメゼッタイ!