web-dev-qa-db-ja.com

java Tomcatutf-8エンコーディングの問題

Java/jsp/Tomcat/mysqlを使用して単純なWebアプリケーションを開発していますが、デフォルトの8851ではなくUTF-8エンコーディングを処理する必要があるため、最も問題があるのは文字エンコーディングです。

まず、私のプログラム構造について説明したいと思います。 Controller.Javaというサーブレットを使用してすべてのリクエストを処理しています。したがって、web.xmlには、*。doからのすべての要求を受け取るControllerサーブレットがあります。

次に、このコントローラーは要求されたURLに基​​づいて要求をディスパッチします。たとえば、クライアントがregister.doを要求した場合、コントローラーはその要求をRegister.Javaにディスパッチします。

また、Register.Javaには、リクエストをパラメータとして受け取るメソッドがあります。

public String perform(HttpServletRequest request) {
    do something with the request...
}

したがって、問題は、このメソッド内でUTF-8で何かを印刷したい場合、ランダムな文字が表示されることです。たとえば、いくつかの定数を格納する列挙型があります。列挙型のプロパティの1つは、繁体字中国語での名前です。印刷すれば

public static void main(Stirng[] args{
    System.out.println(MyEnum.One.getChn());
    logger.info(MyEnum.One.getChn());
}

これは中国語で正しく印刷されます。ただし、HttpServletRequestを処理するメソッド内に正確なコードを配置すると、次のようになります。

public String perform(HttpServletRequest request) {
    System.out.println(MyEnum.One.getChn());
    logger.info(MyEnum.One.getChn());
}

それらはランダムな文字として出力されますが、デバッグウィンドウ(Eclipse)から、変数が正しい漢字を保持していることがわかります。

したがって、request.getParameter()からの値を格納したい場合にも同じ状況が発生します。デバッグウィンドウでは、変数が正しい文字を保持していることがわかりますが、それを印刷するか、データベースに保存しようとすると、ランダムな文字になります。

動作がこのように動作する理由がわかりません。これにより、送信されたフォームの値を読み取ってデータベースに保存できなくなります。誰かがこれについていくつかのヒントを与えることができますか?

まことにありがとうございます。

8
Evan Chu

UTF-8エンコーディングを使用する必要がある場合(そして実際、最近は誰もがこれを使用する必要があります)、TomcatFAQにある「UTF-8everywhereHOWTO」に従うことができます。

http://wiki.Apache.org/Tomcat/FAQ/CharacterEncoding#Q8

データベースのテキストフィールドでもUTF-8をサポートする必要があることに注意してください。

また、ASCII以外の文字を含む文字列をログファイルまたはコンソールに「印刷」すると、

  1. 出力ストリームの文字エンコード
  2. ファイルリーダーの文字エンコード(例:cat/less/vi)
  3. 端末の文字エンコード

値をファイルに書き込んでから、16進エディターを使用して内容を調べ、探しているバイト値を取得していることを確認することをお勧めします。

6

これは、WebアプリケーションでUTF-8を機能させるために必要な小さなチュートリアルです。

文字エンコードのために、アプリケーションにFilterを実装する必要があります。

public class CharacterEncodingFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig)
            throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
            throws IOException, ServletException {
        servletRequest.setCharacterEncoding("UTF-8");
        servletResponse.setContentType("text/html; charset=UTF-8");
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {

    }
}

Tomcatのserver.xmlのファイルコネクタ要素に、値がUTF-8であるURIEncoding属性があることを確認する必要があります。

<Connector port="8080" 
           protocol="HTTP/1.1"
           connectionTimeout="20000"
           URIEncoding="UTF-8"
           redirectPort="8443"/>

また、すべてのJSPページでこれを指定する必要があります。

<%@page contentType="text/html" pageEncoding="UTF-8"%>
11