J'ai besoin de faire fonctionner UTF-8 dans ma webapp Java (servlets + JSP, aucun framework utilisé) pour prendre en charge äöå
etc. pour le texte finlandais régulier et les alphabets cyrilliques comme ЦжФ
pour les cas spéciaux.
Ma configuration est la suivante:
- Environnement de développement: Windows XP
- Environnement de production: Debian
Base de données utilisée: MySQL 5.x
Les utilisateurs utilisent principalement Firefox2 mais aussi Opera 9.x, FF3, IE7 et Google Chrome sont utilisés pour accéder au site.
Comment y parvenir?
Réponses:
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):
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:
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:
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:
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:
Alternativement, toutes les pages JSP de la webapp devraient avoir les éléments suivants en haut:
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:
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:
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:
Ensuite, toutes les tables doivent également être en UTF-8:
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.
Procédures et fonctions mysql
Ceux-ci doivent également avoir le jeu de caractères défini. Par exemple:
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:
É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
dans la version codée
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:
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 leutf8mb4
jeu de caractères (qui nécessite MySQL 5.5.3 ou une version ultérieure). Sachez simplement que l'utilisation duutf8
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:
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8"/>
/etc/httpd/conf
et ajouterAddDefaultCharset 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.la source
pageEncoding
, vous pouvez même les laisser de côté. 2) dans la base de données MySQL et les tables que vous avez utiliséesutf8_swedish_si
, cela aurait dû l'êtreutf8_unicode_ci
. Vous pouvez même laisser la collation de côté, c'est justeCHARACTER SET utf8
assez.<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8"/>
2. Allez dans votre dossier apache, c'est-à/etc/httpd/conf
- dire et ajoutezAddDefaultCharset utf-8
le fichier 'httpd.conf'. 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.Je pense que vous l'avez assez bien résumé dans votre propre réponse.
Au cours du processus UTF-8 (?) De bout en bout, vous pouvez également vous assurer que java utilise lui-même UTF-8. Utilisez -Dfile.encoding = utf-8 comme paramètre de la machine virtuelle Java (peut être configuré dans catalina.bat).
la source
Pour ajouter à la réponse de kosoant , si vous utilisez Spring, plutôt que d'écrire votre propre filtre de servlet, vous pouvez utiliser la classe
org.springframework.web.filter.CharacterEncodingFilter
qu'ils fournissent, en la configurant comme suit dans votre web.xml:la source
Je veux aussi ajouter d' ici cette partie résolu mon problème utf:
la source
C'est pour le codage grec dans les tables MySql lorsque nous voulons y accéder en utilisant Java:
Utilisez la configuration de connexion suivante dans votre pool de connexions JBoss (mysql-ds.xml)
Si vous ne voulez pas mettre cela dans un pool de connexions JNDI, vous pouvez le configurer comme une URL JDBC comme l'illustre la ligne suivante:
Pour moi et Nick, nous ne l'oublions jamais et perdons plus de temps .....
la source
Belle réponse détaillée. je voulais juste ajouter une chose qui aidera certainement les autres à voir le codage UTF-8 sur les URL en action.
Suivez les étapes ci-dessous pour activer le codage UTF-8 sur les URL dans Firefox.
tapez "about: config" dans la barre d'adresse.
Utilisez le type d'entrée de filtre pour rechercher la propriété "network.standard-url.encode-query-utf8".
Le codage UTF-8 sur les URL fonctionne par défaut dans IE6 / 7/8 et chrome.
la source
Les réponses précédentes ne fonctionnaient pas avec mon problème. C'était seulement en production, avec tomcat et apache mod_proxy_ajp. Le corps du message a perdu des caractères non ascii par? Le problème était finalement avec JVM defaultCharset (US-ASCII dans une installation par défaut: Charset dfset = Charset.defaultCharset ();) donc, la solution a été exécutée tomcat server avec un modificateur pour exécuter la JVM avec UTF-8 comme jeu de caractères par défaut:
(ajoutez cette ligne à catalina.sh et redémarrez le service tomcat)
Peut-être que vous devez également changer la variable système linux (éditez ~ / .bashrc et ~ / .profile pour un changement permanent, voir https://perlgeek.de/en/article/set-up-a-clean-utf8-environment )
la source
Je suis avec un problème similaire, mais, dans les noms de fichiers d'un fichier, je compresse avec apache commons. Donc, je l'ai résolu avec cette commande:
ça marche très bien pour moi. J'espère que cela aidera n'importe qui;)
la source
Pour mon cas d'affichage de caractère Unicode à partir de groupes de messages, je n'ai pas besoin d'appliquer la section "Encodage de page JSP" pour afficher Unicode sur ma page jsp. Tout ce dont j'ai besoin, c'est de la section "CharsetFilter".
la source
Un autre point qui n'a pas été mentionné concerne les servlets Java travaillant avec Ajax. J'ai des situations où une page Web récupère du texte utf-8 de l'utilisateur en l'envoyant dans un fichier JavaScript qui l'inclut dans un URI envoyé à la servlet. Le servlet interroge une base de données, capture le résultat et le renvoie au format XML dans le fichier JavaScript qui le met en forme et insère la réponse formatée dans la page Web d'origine.
Dans une application Web, je suivais les premières instructions d'un livre Ajax pour envelopper le JavaScript dans la construction de l'URI. L'exemple du livre utilise la méthode escape (), que j'ai découverte (à la dure) est fausse. Pour utf-8, vous devez utiliser encodeURIComponent ().
Peu de gens semblent lancer leur propre Ajax ces jours-ci, mais j'ai pensé que je pourrais aussi bien ajouter cela.
la source
À propos
CharsetFilter
mentionné dans la réponse @kosoant ....Il y a un build in
Filter
dans tomcatweb.xml
(situé àconf/web.xml
). Le filtre est nommésetCharacterEncodingFilter
et est commenté par défaut. Vous pouvez décommenter cela (n'oubliez pas de décommenter sonfilter-mapping
aussi)Il n'est pas non plus nécessaire de définir
jsp-config
votreweb.xml
(je l'ai testé pour Tomcat 7+)la source
Un certain temps, vous pouvez résoudre le problème via l'assistant administrateur MySQL. Dans
et définissez Def. jeu de caractères: utf8
Peut-être que cette configuration doit redémarrer MySQL.
la source
Face au même problème sur Spring MVC 5 + Tomcat 9 + JSP.
Après de longues recherches, est arrivée une solution élégante ( pas besoin de filtres et pas de changements nécessaires dans le Tomcat server.xml (à partir de la version 8.0.0-RC3))
Dans l'implémentation WebMvcConfigurer, définissez le codage par défaut pour messageSource (pour lire les données des fichiers source des messages dans le codage UTF-8.
Dans l'implémentation DispatcherServletInitializer @Override la méthode onStartup et définissez le codage des caractères de demande et de ressource.
Enregistrez toutes les sources de messages et affichez les fichiers au format UTF-8.
Ajoutez <% @ page contentType = "text / html; charset = UTF-8"%> ou <% @ page pageEncoding = "UTF-8"%> dans chaque fichier * .jsp ou ajoutez un descripteur jsp-config à web.xml
la source
Si vous avez spécifié dans le pool de connexions (mysql-ds.xml), dans votre code Java, vous pouvez ouvrir la connexion comme suit:
la source