このサイトのFAQとして自分に答えることが奨励します。これは私にとってはうまくいきます:
ブラウザやWebアプリケーションのtomcat / javaで使用されるデフォルトの文字セットはlatin1 ieであるため、ほとんどの場合、文字は問題ありません。それらの文字を「理解する」ISO-8859-1。
Java + Tomcat + Linux / Windows + MysqlでUTF-8を動作させるには、以下が必要です。
Tomcatのserver.xmlの構成
コネクターがURL(GET要求)パラメーターをエンコードするためにUTF-8を使用するように構成する必要があります。
<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
次に、Java Webアプリケーションがすべての要求と応答を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 /のエンコーディング。別の方法としては、アプリケーションの各コントローラーで応答エンコーディングなどを設定します。
このフィルターは、web.xmlまたはwebappのデプロイメント記述子に追加する必要があります。
<!--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ページのエンコーディングは、JSPページの文字を正しいエンコーディングで処理するようにJVMに指示します。次に、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接続
データベースを使用する場合、接続が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&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設定することで、-fileをおよび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
Tomcatのserver.xmlでGETリクエストパラメータがUTF-8でエンコードされていると定義されている場合、次の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としてエンコードされます。page / request / everythingはUTF-8を使用するように定義されていますが。äのUTF-8エンコードバージョンは%C3%A4です。
この結果、一部の文字はlatin1でエンコードされ、他の文字はUTF-8でエンコードされるため、webappがGETリクエストからのリクエストパラメーターを正しく処理することは不可能です。
通知:ページがUTF-8として定義されている場合、ブラウザーがフォームからのすべての要求パラメーターを完全にUTF-8でエンコードするため、POST要求は機能します
読むもの
私の問題の答えを提供してくれた次の作家にとても感謝しています:
- 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/
重要な注意点
mysqlは、3バイトのUTF-8文字を使用した基本的な多言語プレーンをサポートしています。それ以外に移動する必要がある場合(特定のアルファベットには3バイトを超えるUTF-8が必要です)、VARBINARY
列タイプのフレーバーを使用するか、またはutf8mb4
文字セット(MySQL 5.5.3以降が必要)を使用する必要があります。utf8
MySQLで文字セットを使用しても、100%動作しないことに注意してください。
Apacheを使用したTomcat
もう1つApache + Tomcat + mod_JKコネクタを使用している場合は、次の変更も行う必要があります。
- URIEncoding = "UTF-8"を8009コネクタのtomcat server.xmlファイルに追加します。これはmod_JKコネクタによって使用されます。
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8"/>
- apacheフォルダーに移動し、IE
/etc/httpd/conf
を追加AddDefaultCharset utf-8
しhttpd.conf file
ます。注:まず、それが存在するかどうかを確認します。存在する場合は、この行で更新できます。この行を下部に追加することもできます。