sql >> データベース >  >> RDS >> Mysql

Java WebアプリケーションでUTF-8を機能させる方法は?

    このサイトのFAQがそれを奨励しているので、自分自身に答えてください。これは私にとってはうまくいきます:

    ブラウザとWebアプリケーションのtomcat/javaで使用されるデフォルトの文字セットはlatin1であるため、ほとんどの場合、文字äåöは問題になりません。それらの文字を「理解する」ISO-8859-1。

    UTF-8をJava+Tomcat + Linux / Windows + MySQLで動作させるには、次のものが必要です。

    Tomcatのserver.xmlの構成

    コネクタがUTF-8を使用してURL(GETリクエスト)パラメータをエンコードするように設定する必要があります:

    <Connector port="8080" maxHttpHeaderSize="8192"
     maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
     enableLookups="false" redirectPort="8443" acceptCount="100"
     connectionTimeout="20000" disableUploadTimeout="true" 
     compression="on" 
     compressionMinSize="128" 
     noCompressionUserAgents="gozilla, traviata" 
     compressableMimeType="text/html,text/xml,text/plain,text/css,text/ javascript,application/x-javascript,application/javascript"
     URIEncoding="UTF-8"
    />
    

    重要な部分はURIEncoding="UTF-8" 上記の例では。これにより、Tomcatがすべての着信GETパラメーターをUTF-8エンコードとして処理することが保証されます。その結果、ユーザーがブラウザーのアドレスバーに次のように書き込むと:

     https://localhost:8443/ID/Users?action=search&name=*ж*
    

    文字жはUTF-8として処理され、%D0%B6 として(通常はサーバーに到達する前にブラウザーによって)エンコードされます。 。

    POSTリクエストはこれによる影響を受けません。

    CharsetFilter

    次に、JavaWebアプリケーションにすべての要求と応答をUTF-8エンコードとして処理するように強制します。これには、次のような文字セットフィルターを定義する必要があります。

    package fi.foo.filters;
    
    import javax.servlet.*;
    import java.io.IOException;
    
    public class CharsetFilter implements Filter {
    
        private String encoding;
    
        public void init(FilterConfig config) throws ServletException {
            encoding = config.getInitParameter("requestEncoding");
            if (encoding == null) encoding = "UTF-8";
        }
    
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain next)
                throws IOException, ServletException {
            // Respect the client-specified character encoding
            // (see HTTP specification section 3.4.1)
            if (null == request.getCharacterEncoding()) {
                request.setCharacterEncoding(encoding);
            }
    
            // Set the default response content type and encoding
            response.setContentType("text/html; charset=UTF-8");
            response.setCharacterEncoding("UTF-8");
    
            next.doFilter(request, response);
        }
    
        public void destroy() {
        }
    }
    

    このフィルターは、ブラウザーが要求で使用されるエンコードを設定していない場合、UTF-8に設定されていることを確認します。

    このフィルターによって行われるもう1つのことは、デフォルトの応答エンコーディングを設定することです。返されたhtml/whateverが含まれるエンコーディング。別の方法は、アプリケーションの各コントローラーで応答エンコーディングなどを設定することです。

    このフィルターはweb.xmlに追加する必要があります またはWebアプリケーションのデプロイメント記述子:

     <!--CharsetFilter start--> 
    
      <filter>
        <filter-name>CharsetFilter</filter-name>
        <filter-class>fi.foo.filters.CharsetFilter</filter-class>
          <init-param>
            <param-name>requestEncoding</param-name>
            <param-value>UTF-8</param-value>
          </init-param>
      </filter>
    
      <filter-mapping>
        <filter-name>CharsetFilter</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>
    

    このフィルターを作成する手順は、 tomcat wiki( )にあります。 http://wiki.apache.org/tomcat/Tomcat/UTF-8

    JSPページエンコーディング

    web.xmlで 、以下を追加します:

    <jsp-config>
        <jsp-property-group>
            <url-pattern>*.jsp</url-pattern>
            <page-encoding>UTF-8</page-encoding>
        </jsp-property-group>
    </jsp-config>
    

    または、WebアプリケーションのすべてのJSPページの上部に、次のものを含める必要があります。

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

    異なるJSPフラグメントを持つある種のレイアウトが使用されている場合、これはすべてで必要です。 それらの。

    HTML-メタタグ

    JSPページエンコーディングは、JVMにJSPページの文字を正しいエンコーディングで処理するように指示します。次に、HTMLページがどのエンコーディングであるかをブラウザに通知します。

    これは、webappによって生成された各xhtmlページの上部にある次の方法で実行されます。

       <?xml version="1.0" encoding="UTF-8"?>
       <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
       <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fi">
       <head>
       <meta http-equiv='Content-Type' content='text/html; charset=UTF-8' />
       ...
    

    JDBC接続

    dbを使用する場合は、接続でUTF-8エンコーディングを使用するように定義する必要があります。これはcontext.xmlで行われます または、JDBC接続が次のように防御されている場合:

          <Resource name="jdbc/AppDB" 
            auth="Container"
            type="javax.sql.DataSource"
            maxActive="20" maxIdle="10" maxWait="10000"
            username="foo"
            password="bar"
            driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/      ID_development?useEncoding=true&amp;characterEncoding=UTF-8"
        />
    

    MySQLデータベースとテーブル

    使用するデータベースはUTF-8エンコーディングを使用する必要があります。これは、次のデータベースを作成することで実現されます。

       CREATE DATABASE `ID_development` 
       /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_swedish_ci */;
    

    次に、すべてのテーブルがUTF-8である必要があります:

       CREATE TABLE  `Users` (
        `id` int(10) unsigned NOT NULL auto_increment,
        `name` varchar(30) collate utf8_swedish_ci default NULL
        PRIMARY KEY  (`id`)
       ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_swedish_ci ROW_FORMAT=DYNAMIC;
    

    重要な部分はCHARSET=utf8

    MySQLサーバー構成

    MySQLサーバーも構成する必要があります。通常、これはWindowsで my.iniを変更することによって行われます。 -ファイルおよびLinuxではmy.cnfを構成します -file。これらのファイルでは、サーバーに接続されているすべてのクライアントがデフォルトの文字セットとしてutf8を使用し、サーバーが使用するデフォルトの文字セットもutf8であることを定義する必要があります。

       [client]
       port=3306
       default-character-set=utf8
    
       [mysql]
       default-character-set=utf8
    

    Mysqlのプロシージャと関数

    これらにも文字セットを定義する必要があります。例:

       DELIMITER $$
    
       DROP FUNCTION IF EXISTS `pathToNode` $$
       CREATE FUNCTION `pathToNode` (ryhma_id INT) RETURNS TEXT CHARACTER SET utf8
       READS SQL DATA
       BEGIN
    
        DECLARE path VARCHAR(255) CHARACTER SET utf8;
    
       SET path = NULL;
    
       ...
    
       RETURN path;
    
       END $$
    
       DELIMITER ;
    

    GETリクエスト:latin1およびUTF-8

    GETリクエストパラメータがUTF-8でエンコードされていることがtomcatのserver.xmlで定義されている場合、次のGETリクエストが適切に処理されます。

       https://localhost:8443/ID/Users?action=search&name=Petteri
       https://localhost:8443/ID/Users?action=search&name=ж
    

    ASCII文字はlatin1とUTF-8の両方で同じ方法でエンコードされるため、文字列「Petteri」は正しく処理されます。

    キリル文字のжは、latin1ではまったく理解されていません。 Tomcatは要求パラメーターをUTF-8として処理するように指示されているため、その文字を%D0%B6として正しくエンコードします。 。

    ブラウザがUTF-8エンコーディング(リクエストヘッダーとhtmlメタタグ付き)でページを読み取るように指示された場合、この期間の少なくともFirefox 2/3およびその他のブラウザはすべて、文字自体を%D0%としてエンコードします。 B6

    その結果、「Petteri」という名前のすべてのユーザーが検出され、「ж」という名前のすべてのユーザーも検出されます。

    しかし、äåöはどうですか?

    HTTP仕様では、デフォルトでURLがlatin1としてエンコードされると定義されています。これにより、firefox2、firefox3などが次のようにエンコードされます

        https://localhost:8443/ID/Users?action=search&name=*Päivi*
    

    エンコードされたバージョンに

        https://localhost:8443/ID/Users?action=search&name=*P%E4ivi*
    

    latin1では、文字ä %E4としてエンコードされます 。 ページ/リクエスト/すべてがUTF-8を使用するように定義されている場合でも 。 äのUTF-8エンコードバージョンは%C3%A4 です

    この結果、一部の文字はlatin1でエンコードされ、他の文字はUTF-8でエンコードされるため、ウェブアプリがGETリクエストからのリクエストパラメータを正しく処理することはまったく不可能です。注意:ブラウザがすべてのリクエストパラメータをエンコードするため、POSTリクエストは機能しますページがUTF-8として定義されている場合は、完全にUTF-8のフォームから

    読むべきもの

    私の問題に対する答えを与えてくれた以下の作家に非常に感謝します:

    • http://tagunov.tripod.com/i18n/i18n.html
    • http://wiki.apache.org/tomcat/Tomcat/UTF-8
    • http://java.sun.com/developer/technicalArticles/Intl/HTTPCharset/
    • http://dev.mysql.com/doc/refman/5.0/en/charset-syntax.html
    • http://cagan327.blogspot.com/2006/05/utf-8-encoding-fix-tomcat-jsp-etc.html
    • http://cagan327.blogspot.com/2006/05/utf-8-encoding-fix-for-mysql-tomcat.html
    • http://jeppesn.dk/utf-8.html
    • http://www.nabble.com/request-parameters-mishandle-utf-8-encoding-td18720039.html
    • http://www.utoronto.ca/webdocs/HTMLdocs/NewHTML/iso_table.html
    • http://www.utf8-chartable.de/

    重要な注意事項

    基本多言語面 をサポートします 3バイトのUTF-8文字を使用します。その外に出る必要がある場合(特定のアルファベットには3バイト以上のUTF-8が必要です)、 VARBINARYのフレーバーを使用する必要があります。 列を入力するか、 utf8mb4 文字セット (MySQL 5.5.3以降が必要です)。 utf8の使用に注意してください MySQLで設定された文字セットは100%機能しません。

    TomcatとApache

    もう1つ、Apache + Tomcat + mod_JKコネクタを使用している場合は、次の変更も行う必要があります。

    1. 8009コネクタのtomcatserver.xmlファイルにURIEncoding="UTF-8"を追加します。これはmod_JKコネクタによって使用されます。
    2. apacheフォルダー、つまり / etc / httpd / confに移動します AddDefaultCharset utf-8を追加します httpd.confファイル内 。 注: まず、それが存在するかどうかを確認します。存在する場合は、この行で更新できます。この行を下部に追加することもできます。


    1. MySQLエラー1264:列の値が範囲外です

    2. SQLiteで外部キーのリストを返す

    3. 最大日付で記録をとる

    4. SQLServerExpressバックアップデータベース| SQLExpressバックアップの自動化とパージをスケジュールする方法