8

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

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

次に、このコントローラーは、要求された 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() からの値を保存する場合も同じ状況が発生します。デバッグ ウィンドウで、変数が正しい文字を保持していることを確認できますが、出力したり、データベースに保存しようとすると、ランダムな文字になります。

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

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

4

2 に答える 2

11

これは、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"%>
于 2012-06-10T19:37:04.223 に答える
6

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

http://wiki.apache.org/tomcat/FAQ/CharacterEncoding#Q8

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

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

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

値をファイルに書き込んでから、16 進エディタを使用して内容を調べ、探しているバイト値を取得していることを確認する方がよい場合があります。

于 2012-06-07T19:03:27.930 に答える