Java webappsでUTF-8を機能させる方法は?
質問
通常のフィンランド語のäöå
などをサポートするには、Java webapp(サーブレット+ JSP、フレームワークを使用しない)でUTF-8を動作させる必要がありますЦжФ
などの特殊な場合のテキストとキリル文字。
私のセットアップは次のとおりです。
- 開発環境:Windows XP
- 本番環境:Debian
使用するデータベース:MySQL 5.x
ユーザーは主にFirefox2を使用しますが、Opera 9.x、FF3、IE7、およびGoogle Chromeもサイトへのアクセスに使用されます。
これを達成するにはどうすればよいですか
解決
このサイトのFAQとして自分自身に答えることは、それを奨励します。これは私のために働く:
ほとんどの文字äåöブラウザやtomcat / javaがwebappsで使用するデフォルトの文字セットはlatin1なので、問題ありません。 「理解」するISO-8859-1;それらの文字。
Java + Tomcat + Linux / Windows + MysqlでUTF-8を機能させるには、次のものが必要です。
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 =&quot; UTF-8&quot; です。これにより、Tomcatはすべての着信GETパラメーターをUTF-8エンコードとして処理します。 その結果、ユーザーがブラウザのアドレスバーに次のように書き込むと、
https://localhost:8443/ID/Users?action=search&name=*ж*
文字&#1078; UTF-8として処理され、%D0%B6 としてエンコードされます(通常はサーバーに到達する前にブラウザーによってエンコードされます)。
POSTリクエストはこの影響を受けません。
CharsetFilter
次に、すべての要求と応答をUTF-8エンコードとして処理するようにjava webappを強制します。これには、次のような文字セットフィルターを定義する必要があります。
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に設定されていることを確認します。
このフィルターによって行われる他のことは、デフォルトの応答エンコードを設定することです。返されるhtml / whateverのエンコーディング。別の方法は、アプリケーションの各コントローラーで応答エンコードなどを設定することです。
このフィルターは、 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( < a href = "http://wiki.apache.org/tomcat/Tomcat/UTF-8" rel = "noreferrer"> 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>
別の方法として、webappのすべてのJSPページの上部に以下を含める必要があります。
<%@page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>
異なるJSPフラグメントを含むある種のレイアウトを使用する場合、すべてで必要になります。
HTML-metaタグ
JSPページエンコーディングは、JVMページ内の文字を正しいエンコーディングで処理するよう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接続
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&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 serveriも設定する必要があります。通常、これは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の両方で同じ方法でエンコードされるため、文字列&quot; Petteri&quot;正しく処理されます。
他のヒント
あなたはあなた自身の答えでそれを非常にうまくまとめていると思います。
UTF-8-ing(?)のプロセス全体で、java自体がUTF-8を使用していることを確認することもできます。 JVMのパラメーターとして-Dfile.encoding = utf-8を使用します(catalina.batで構成可能)。
kosoantの回答に追加するには、独自のサーブレットフィルターを作成するのではなく、Springを使用している場合、クラス org.springframework.web.filter.CharacterEncodingFilter
が提供し、web.xmlで次のように設定します:
<filter>
<filter-name>encoding-filter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>FALSE</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding-filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
こちらからこの部分を追加したいので、utfの問題が解決しました。
runtime.encoding=<encoding>
これは、Javaを使用してMySqlテーブルにアクセスする場合のMySqlテーブルのギリシャ語エンコード用です。
JBoss接続プール(mysql-ds.xml)で次の接続設定を使用します
<connection-url>jdbc:mysql://192.168.10.123:3308/mydatabase</connection-url>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<user-name>nts</user-name>
<password>xaxaxa!</password>
<connection-property name="useUnicode">true</connection-property>
<connection-property name="characterEncoding">greek</connection-property>
これをJNDI接続プールに入れたくない場合は、次の行に示すようにJDBC-urlとして設定できます。
jdbc:mysql://192.168.10.123:3308/mydatabase?characterEncoding=greek
私とニックにとって、私たちはそれを決して忘れず、もう時間を無駄にします.....
詳細な回答。実行中のURLのUTF-8エンコードを他の人が確実に確認できるように、もう1つ追加したかっただけです。
以下の手順に従って、FirefoxのURLでUTF-8エンコードを有効にします。
-
type&quot; about:config&quot;アドレスバーで。
-
フィルター入力タイプを使用して、「network.standard-url.encode-query-utf8」を検索します。プロパティ。
- 上記のプロパティはデフォルトでfalseになります。TRUEに設定します。
- ブラウザを再起動します。
IE6 / 7/8およびchromeでは、URLのUTF-8エンコードがデフォルトで機能します。
同様の問題を抱えていますが、ファイルのファイル名では、Apache Commonsで圧縮しています。 だから、私はこのコマンドでそれを解決しました:
convmv --notest -f cp1252 -t utf8 * -r
それは私にとって非常にうまく機能します。それが誰にも役立つことを願っています;)
メッセージバンドルからUnicode文字を表示する場合、「JSPページエンコーディング」を適用する必要はありません。 jspページにUnicodeを表示するセクション。必要なのは&quot; CharsetFilter&quot;だけですセクション。
言及されていないもう1つの点は、Ajaxで動作するJavaサーブレットに関するものです。 Webページが、サーブレットに送信されるURIに含まれるJavaScriptファイルにこれを送信するユーザーからutf-8テキストを取得する状況があります。サーブレットはデータベースにクエリを実行し、結果をキャプチャしてXMLとしてJavaScriptファイルに返します。JavaScriptファイルはそれをフォーマットし、フォーマットされた応答を元のWebページに挿入します。
あるWebアプリでは、URIを構築する際にJavaScriptをまとめるための初期のAjax本の指示に従いました。本の例では、escape()メソッドを使用しましたが、これは(難しい方法で)間違っていることがわかりました。 utf-8の場合、encodeURIComponent()を使用する必要があります。
最近、自分のAjaxを使用する人はほとんどいないようですが、これを追加することも考えました。
@kosoant answerで言及されている CharsetFilter
について....
tomcat web.xml
の Filter
にビルドがあります( conf / web.xml
にあります)。フィルターの名前は setCharacterEncodingFilter
で、デフォルトでコメントが付けられています。これのコメントを解除できます( filter-mapping
もコメントを外してください)
また、 web.xml
に jsp-config
を設定する必要はありません(Tomcat 7+でテスト済みです)
MySQL管理者ウィザードを使用して問題を解決できる場合があります。
スタートアップ変数&gt;詳細&gt;
Defを設定します。文字セット:utf8
この設定ではMySQLを再起動する必要があるかもしれません。
以前の応答は私の問題では機能しませんでした。これは、tomcatとapache mod_proxy_ajpを使用した本番環境のみでした。投稿本文で非ASCII文字が失われましたか? 問題は最終的にJVM defaultCharsetにありました(デフォルトのインストールのUS-ASCII:Charset dfset = Charset.defaultCharset();) そのため、UTF-8をデフォルトの文字セットとしてJVMを実行する修飾子を使用してtomcatサーバーを実行しました。
JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8"
(catalina.shにこの行を追加し、Tomcatを再起動します)
Linuxシステム変数も変更する必要があります(永続的な変更のために〜/ .bashrcおよび〜/ .profileを編集します。 https://perlgeek.de/en/article/set-up-a-clean-utf8-environment )
export LC_ALL = en_US.UTF-8
LANG = en_US.UTF-8をエクスポートLANGUAGE = en_US.UTF-8をエクスポート
Spring MVC 5 + Tomcat 9 + JSPで同じ問題に直面しました。
長い研究の後、エレガントなソリューションになりました(いいえはフィルターを必要とせず、いいえはTomcatで変更を必要としません< strong> server.xml (8.0.0-RC3バージョン以降)
-
WebMvcConfigurer実装では、messageSourceのデフォルトエンコーディングを設定します(UTF-8エンコーディングでメッセージソースファイルからデータを読み取るため。
@Configuration @EnableWebMvc @ComponentScan("{package.with.components}") public class WebApplicationContextConfig implements WebMvcConfigurer { @Bean public MessageSource messageSource() { final ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); messageSource.setBasenames("messages"); messageSource.setDefaultEncoding("UTF-8"); return messageSource; } /* other beans and methods */ }
-
DispatcherServletInitializerの実装で、onStartupメソッドを@Overrideし、リクエストとリソースの文字エンコーディングを設定します。
public class DispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { @Override public void onStartup(final ServletContext servletContext) throws ServletException { // https://wiki.apache.org/tomcat/FAQ/CharacterEncoding servletContext.setRequestCharacterEncoding("UTF-8"); servletContext.setResponseCharacterEncoding("UTF-8"); super.onStartup(servletContext); } /* servlet mappings, root and web application configs, other methods */ }
-
すべてのメッセージソースを保存し、UTF-8エンコーディングでファイルを表示します。
-
&lt;%@ページcontentType =&quot; text / html; charset = UTF-8&quot; %&gt; または&lt;%@ page pageEncoding =&quot; UTF-8&quot; %&gt;各* .jspファイルで jsp-config記述子をweb.xmlに追加
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>AppName</display-name> <jsp-config> <jsp-property-group> <url-pattern>*.jsp</url-pattern> <page-encoding>UTF-8</page-encoding> </jsp-property-group> </jsp-config> </web-app>
接続プール(mysql-ds.xml)で指定した場合、Javaコードで次のように接続を開くことができます:
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
Connection conn = DriverManager.getConnection(
"jdbc:mysql://192.168.1.12:3308/mydb?characterEncoding=greek",
"Myuser", "mypass");