Me répondre car la FAQ de ce site l'encourage. Cela fonctionne pour moi:
La plupart du temps, les caractères äåö ne sont pas problématiques car le jeu de caractères par défaut utilisé par les navigateurs et tomcat / java pour les applications Web est latin1, c'est-à-dire. ISO-8859-1 qui "comprend" ces caractères.
Pour que UTF-8 fonctionne sous Java + Tomcat + Linux / Windows + Mysql, il faut:
Configuration de server.xml de Tomcat
Il est nécessaire de configurer que le connecteur utilise UTF-8 pour coder les paramètres url (demande 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"
/>
L'élément clé étant URIEncoding = "UTF-8" dans l'exemple ci-dessus. Cela garantit que Tomcat gère tous les paramètres GET entrants au format UTF-8. Par conséquent, lorsque l'utilisateur écrit ce qui suit dans la barre d'adresse du navigateur:
https://localhost:8443/ID/Users?action=search&name=*ж*
le caractère ж est traité comme UTF-8 et est encodé en (généralement par le navigateur avant même d'arriver au serveur) en tant que % D0% B6 .
Les requêtes POST ne sont pas affectées par cela.
CharsetFilter
Il est alors temps de forcer la webapp Java à gérer toutes les demandes et réponses au format UTF-8. Cela nécessite que nous définissions un filtre de jeu de caractères comme suit:
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() {
}
}
Ce filtre garantit que si le navigateur n'a pas défini l'encodage utilisé dans la demande, il est défini sur UTF-8.
L'autre chose effectuée par ce filtre est de définir l'encodage de réponse par défaut, c'est-à-dire. l'encodage dans lequel le code HTML renvoyé / quel qu'il soit. L'alternative consiste à définir le codage de réponse, etc. dans chaque contrôleur de l'application.
Ce filtre doit être ajouté au web.xml ou au descripteur de déploiement de la 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>
Les instructions pour créer ce filtre se trouvent sur le wiki tomcat ( http://wiki.apache.org/tomcat/Tomcat/UTF-8 )
Encodage de page JSP
Dans votre web.xml , ajoutez les éléments suivants:
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<page-encoding>UTF-8</page-encoding>
</jsp-property-group>
</jsp-config>
Alternativement, toutes les pages JSP de la webapp devraient avoir les éléments suivants en haut:
<%@page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>
Si une sorte de mise en page avec différents fragments JSP est utilisée, cela est nécessaire dans chacun d'eux.
Balises HTML-méta
L'encodage de page JSP indique à la JVM de gérer les caractères de la page JSP dans l'encodage correct. Ensuite, il est temps de dire au navigateur dans lequel l'encodage de la page html est:
Cela se fait avec ce qui suit en haut de chaque page xhtml produite par la webapp:
<?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' />
...
Connexion JDBC
Lors de l'utilisation d'une base de données, il faut définir que la connexion utilise le codage UTF-8. Cela se fait dans context.xml ou partout où la connexion JDBC est désactivée comme suit:
<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"
/>
Base de données et tables MySQL
La base de données utilisée doit utiliser le codage UTF-8. Ceci est réalisé en créant la base de données avec les éléments suivants:
CREATE DATABASE `ID_development`
/*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_swedish_ci */;
Ensuite, toutes les tables doivent également être en 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;
La partie clé étant CHARSET = utf8 .
Configuration du serveur MySQL
Le serveur MySQL doit également être configuré. Généralement, cela se fait sous Windows en modifiant my.ini -file et sous Linux en configurant my.cnf -file. Dans ces fichiers, il convient de définir que tous les clients connectés au serveur utilisent utf8 comme jeu de caractères par défaut et que le jeu de caractères par défaut utilisé par le serveur est également utf8.
[client]
port=3306
default-character-set=utf8
[mysql]
default-character-set=utf8
Procédures et fonctions mysql
Ceux-ci doivent également avoir le jeu de caractères défini. Par exemple:
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 ;
Demandes GET: latin1 et UTF-8
Si et quand il est défini dans server.xml de tomcat que les paramètres de requête GET sont encodés en UTF-8, les requêtes GET suivantes sont traitées correctement:
https://localhost:8443/ID/Users?action=search&name=Petteri
https://localhost:8443/ID/Users?action=search&name=ж
Étant donné que les caractères ASCII sont codés de la même manière avec latin1 et UTF-8, la chaîne "Petteri" est gérée correctement.
Le caractère cyrillique ж n'est pas du tout compris en latin1. Étant donné que Tomcat est chargé de gérer les paramètres de demande au format UTF-8, il code correctement ce caractère en tant que % D0% B6 .
Si et quand les navigateurs sont invités à lire les pages en encodage UTF-8 (avec en-têtes de demande et méta-balise html), au moins Firefox 2/3 et les autres navigateurs de cette période codent tous le caractère eux-mêmes en tant que % D0% B6 .
Le résultat final est que tous les utilisateurs avec le nom "Petteri" sont trouvés et aussi tous les utilisateurs avec le nom "ж".
Mais qu'en est-il de l'äåö?
La spécification HTTP définit que, par défaut, les URL sont codées en latin1. Il en résulte que firefox2, firefox3 etc. codent les éléments suivants
https://localhost:8443/ID/Users?action=search&name=*Päivi*
dans la version codée
https://localhost:8443/ID/Users?action=search&name=*P%E4ivi*
En latin1, le caractère ä est codé en % E4 . Même si la page / demande / tout est défini pour utiliser UTF-8 . La version codée UTF-8 de ä est % C3% A4
Le résultat de cela est qu'il est tout à fait impossible pour la webapp de gérer correctement les paramètres de requête des requêtes GET car certains caractères sont encodés en latin1 et d'autres en UTF-8.
Remarque: les demandes POST fonctionnent comme les navigateurs codent tous les paramètres de demande des formulaires complètement en UTF-8 si la page est définie comme étant UTF-8
Des trucs à lire
Un très grand merci aux rédacteurs suivants pour avoir donné les réponses à mon problème:
- 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/
Note importante
mysqlprend en charge le plan multilingue de base en utilisant des caractères UTF-8 à 3 octets. Si vous devez aller au-delà de cela (certains alphabets nécessitent plus de 3 octets de UTF-8), alors vous devez soit utiliser une saveur de VARBINARY
type colonne, soit utiliser le utf8mb4
jeu de caractères (qui nécessite MySQL 5.5.3 ou une version ultérieure). Sachez simplement que l'utilisation du utf8
jeu de caractères dans MySQL ne fonctionnera pas à 100%.
Tomcat avec Apache
Encore une chose Si vous utilisez le connecteur Apache + Tomcat + mod_JK, vous devez également effectuer les modifications suivantes:
- Ajoutez URIEncoding = "UTF-8" dans le fichier tomcat server.xml pour le connecteur 8009, il est utilisé par le connecteur mod_JK.
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8"/>
- Aller à votre dossier apache -à- dire
/etc/httpd/conf
et ajouter AddDefaultCharset utf-8
à httpd.conf file
. Remarque: Vérifiez d'abord qu'elle existe ou non. S'il existe, vous pouvez le mettre à jour avec cette ligne. Vous pouvez également ajouter cette ligne en bas.