Comment obtenir de l'UTF-8 Java webapps?
J'ai besoin d'obtenir de l'UTF-8 dans mon Java de l'application web (servlets + JSP, pas de cadre utilisé) à l'appui de äöå
etc. régulièrement finlandais texte et les alphabets Cyrillique comme ЦжФ
pour des cas particuliers.
Ma configuration est la suivante:
- Environnement de développement: Windows XP
- Environnement de Production: Debian
Base de données: MySQL 5.x
Principalement les utilisateurs d'utiliser Firefox2, mais aussi Opera 9.x, FF3, IE7 et Google Chrome sont utilisés pour accéder au site.
Comment faire?
- Voir aussi stackoverflow.com/questions/153527/...
Vous devez vous connecter pour publier un commentaire.
Répondre à moi-même que la FAQ de ce site encourage. Cela fonctionne pour moi:
La plupart des personnages äåö ne sont pas une problématique que le jeu de caractères par défaut utilisé par les navigateurs et tomcat/java pour webapps est latin1 ie. ISO-8859-1, qui "comprend" ces caractères.
Pour obtenir de l'UTF-8 sous Java+Tomcat+Linux/Windows+Mysql requiert les éléments suivants:
La configuration de Tomcat server.xml
Il est nécessaire de configurer le connecteur utilise UTF-8 pour encoder l'url (GET) paramètres:
La clé de la partie URIEncoding="UTF-8" dans l'exemple ci-dessus. Cela garantit que le serveur Tomcat gère tous les paramètres GET comme codé en UTF-8.
En conséquence, lorsque l'utilisateur écrit ce qui suit dans la barre d'adresse du navigateur:
le caractère ж est traitée comme de l'UTF-8 et il est codé (en général, par le navigateur avant même de faire le serveur) %D0%B6.
POST de demande ne sont pas affectés par ce problème.
CharsetFilter
Alors il est temps de forcer le java webapp pour traiter toutes les demandes et les réponses codées en UTF-8. Cela implique de définir un ensemble de caractères filtre comme suit:
Ce filtre permet de s'assurer que si le navigateur n'a pas défini le codage utilisé dans la requête, que c'est de l'UTF-8.
L'autre chose qui doit être faite par ce filtre est de définir la valeur par défaut de réponse de l'encodage ie. l'encodage dans lequel le code html renvoyé/tout ce qui est. La solution consiste à définir la réponse de l'encodage etc. dans chaque contrôleur de l'application.
Ce filtre doit être ajouté à la web.xml ou le descripteur de déploiement de la webapp:
Les instructions pour la fabrication de ce filtre se trouve à l' tomcat wiki (http://wiki.apache.org/tomcat/Tomcat/UTF-8)
JSP le codage de la page
Dans votre web.xml, ajoutez la ligne suivante:
Alternativement, tous les JSP pages de l'application web aura besoin d'avoir la suite au-dessus d'eux:
Si un certain type de mise en page avec les différents JSP-fragments est utilisé, ce qui est nécessaire dans tous d'entre eux.
HTML-balises meta
JSP le codage de la page indique la JVM pour gérer les caractères dans la page JSP dans le bon encodage.
Alors il est temps de dire au navigateur dans lequel l'encodage de la page html est:
C'est réalisé avec le code suivant en haut de chaque page xhtml produite par la webapp:
JDBC connexion
Lors de l'utilisation de la base de données, c'est-à-dire que la connexion utilise le codage UTF-8. Ceci est fait dans le context.xml ou de l'endroit où la connexion JDBC est définie comme suit:
De base de données MySQL et les tableaux
La base de données utilisée doit utiliser l'encodage UTF-8. Ce résultat est obtenu par la création de la base de données avec les éléments suivants:
Puis, toutes les tables doivent être en UTF-8 aussi:
La clé de la partie CHARSET=utf8.
Configuration du serveur MySQL
MySQL serveri doit être configuré également. Typiquement, cela se fait dans Windows en modifiant mon.ini -le fichier et sous Linux en configuration de mon.cnf -fichier.
Dans ces fichiers, il convient de définir ce que tous les clients connectés au serveur utilise utf8 comme le jeu de caractères par défaut et que le jeu de caractères par défaut utilisé par le serveur est également utf8.
Mysql les procédures et les fonctions
Ces également besoin d'avoir le jeu de caractères défini. Par exemple:
Requêtes GET: latin1 et UTF-8
Si et quand il est défini dans tomcat server.xml que OBTENIR les paramètres de la demande sont encodés en UTF-8, la suite des demandes sont traitées de manière adéquate:
Parce que des caractères ASCII sont codés de la même manière avec le latin1 et UTF-8, la chaîne "Petteri" est gérée correctement.
Le Cyrillique caractère ж n'est pas comprise dans latin1. Parce que Tomcat est chargé de gérer les paramètres de la demande comme de l'UTF-8 il code pour que le caractère correctement %D0%B6.
Si et quand les navigateurs sont priés de lire les pages en UTF-8 (avec les en-têtes de requête et html meta-tag), au moins Firefox 2/3 et les autres navigateurs à partir de cette période, tous les encoder les caractères eux-mêmes comme des %D0%B6.
Le résultat final est que tous les utilisateurs avec le nom "Petteri" sont disponibles et également à tous les utilisateurs avec le nom "ж" trouvés.
Mais qu'äåö?
HTTP-spécification définit que par défaut, les Url sont codées comme latin1. Il en résulte firefox2, firefox3 etc. codant pour la suite
à la version encodée
En latin1 le caractère ø est codé en %E4. Même si la page/demande/tout est défini pour utiliser UTF-8. UTF-8 est la version de ä est %C3%A4
Le résultat de ceci est que c'est tout à fait impossible pour la webapp pour correly gérer les paramètres de requêtes à partir de requêtes GET comme certains caractères sont codés en latin1 et d'autres en UTF-8.
Avis: POST demandes de ne travailler que des navigateurs coder tous les paramètres de la requête à partir de formes entièrement en UTF-8 si la page est définie comme étant en UTF-8
Des trucs à lire
Un très grand merci pour les écrivains de la suite pour donner des réponses à mon problème:
Remarque Importante
mysql prend en charge le Plan Multilingue De Base à l'aide de 3 octets de caractères UTF-8. Si vous avez besoin d'aller à l'extérieur de l' (certains alphabets besoin de plus de 3 octets en UTF-8), alors vous devez soit utiliser une saveur de
VARBINARY
type de colonne ou de l'utilisation de lautf8mb4
jeu de caractères (ce qui nécessite MySQL 5.5.3 ou plus tard). Juste être conscient que l'utilisation de lautf8
un ensemble de caractères dans MySQL ne fonctionne pas 100% du temps.Tomcat Apache
Une chose de plus Si vous utilisez Apache + Tomcat + connecteur mod_JK, alors vous aussi besoin de faire les modifications suivantes:
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8"/>
/etc/httpd/conf
et ajouterAddDefaultCharset utf-8
danshttpd.conf file
. Remarque: vérifiez d'Abord qu'il existe ou pas. Si existe pas, vous pouvez le mettre à jour avec cette ligne. Vous pouvez ajouter cette ligne à bas aussi.pageEncoding
, de sorte que vous pouvez même le laisser à l'écart. 2) dans MySQL base de données et tableaux vous avez utiliséutf8_swedish_si
, ce qui devrait avoir étéutf8_unicode_ci
. Vous pouvez même laisser le classement de suite,CHARACTER SET utf8
est assez.CHARACTER SET utf8
désignation dans MySQL peut stocker uniquement les caractères qui sont dans le format BMP (Basic Multilingual Plane) et ne supporte pas les "vrais" UTF-8, mais un 3 octets sous-ensemble de celui-ci. Vous pouvez lire beaucoup plus sur cette ici et ici.<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8"/>
2. Goto votre dossier d'apache c'est à dire/etc/httpd/conf
et ajouterAddDefaultCharset utf-8
dans 'httpd.conf' de fichier. Remarque: vérifiez d'abord qu'il existe ou pas. Si existe pas, vous pouvez le mettre à jour avec cette ligne. Vous pouvez ajouter cette ligne à bas aussi.server.xml
? A. Il n'a pas. Certains de ce qui, par conséquent, ne fait pas de sens. Si l'ISO-8859-1 est l'encodage utilisé par défaut par les navigateurs, c'est sûrement ce que vous devez spécifier dansserver.xml
?URIEncoding
sur un<Connector>
est maintenantUTF-8
, sauf si vous utilisez stricte spec-conformité (dans ce cas, la valeur par défaut estISO-8859
, mais peut toujours être remplacée).Je pense que vous, résume assez bien dans votre propre réponse.
Dans le processus de l'UTF-8-ing(?) du début à la fin, vous pourriez aussi assurez-vous que java est l'utilisation de l'UTF-8. Utilisez -Dfile.encoding=utf-8 en tant que paramètre à la JVM (peut être configuré dans catalina.chauve-souris).
À ajouter à kosoant réponse, si vous utilisez le Printemps, plutôt que d'écrire votre propre filtre de Servlet, vous pouvez utiliser la classe
org.springframework.web.filter.CharacterEncodingFilter
qu'ils fournissent, une configuration comme celle-ci dans votre web.xml:Je tiens également à ajouter de ici cette partie résolu mon utf problème:
C'est pour les grecs de l'Encodage dans des tables MySql lorsque nous voulons accéder à l'aide de Java:
Utiliser la connexion suivante de l'installation dans votre JBoss pool de connexion (mysql-ds.xml)
Si vous ne voulez pas mettre cela dans une connexion JNDI de la piscine, vous pouvez le configurer comme un JDBC url-comme la ligne suivante illustre:
Pour moi et Nick, de sorte que nous ne l'oubliez jamais et perdre du temps plus.....
Belle réponse détaillée. je voulais juste rajouter une chose de plus qui va certainement aider les autres à voir le codage UTF-8 sur les URLs dans l'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.
Utiliser le filtre d'entrée de la recherche pour "réseau.standard-url.encoder-requête-utf8" de la propriété.
L'encodage UTF-8 sur les Url qui fonctionne par défaut dans IE6/7/8 et chrome.
Je suis avec un problème similaire, mais, dans les noms de fichier d'un fichier, je suis la compression avec apache commons.
Alors, j'ai résolu avec cette commande:
il fonctionne très bien pour moi. Espérons que cela aide quelqu'un 😉
Pour mon cas de l'affichage de caractères Unicode à partir d'un message bundles, je n'ai pas besoin d'appliquer "JSP le codage de la page de la section" pour afficher l'Unicode sur ma page jsp. Tout ce que je besoin est "CharsetFilter" section.
Un autre point qui n'a pas été mentionné concerne les Servlets Java de travail avec l'Ajax. J'ai situations où une page web est de ramasser de l'utf-8 de texte de l'utilisateur, l'envoi de ce à un fichier JavaScript qui l'inclut dans un URI envoyé à la Servlet. La Servlet interroge une base de données, capture le résultat et le renvoie au format XML pour le fichier JavaScript qui les met en forme et insère la mise en forme de la réponse dans la page web d'origine.
Dans une application web, j'ai été à la suite d'un début de l'Ajax du livre d'instructions pour l'emballage jusqu'à l'JavaScript dans la construction de l'URI. L'exemple dans le livre utilisé la méthode escape (), que j'ai découvert (à la dure) est erroné. Pour l'utf-8, vous devez utiliser encodeURIComponent().
Peu de gens semblent rouler leur propre Ajax ces jours, mais j'ai pensé que je pourrais aussi bien ajouter ce.
Sur
CharsetFilter
mentionné dans @kosoant de réponse ....Il y a une accumulation dans
Filter
dans tomcatweb.xml
(situé àconf/web.xml
). Le filtre est nommésetCharacterEncodingFilter
et est commenté par défaut. Vous pouvez décommentez la ligne suivante ( n'oubliez pas de décommenter sonfilter-mapping
trop )Aussi il n'est pas nécessaire de définir
jsp-config
dans votreweb.xml
(j'ai tester pour Tomcat 7+ )Un certain temps, vous pouvez résoudre le problème par le biais de MySQL Administrateur assistant. Dans
et set Def. Jeu de caractères:utf8
Peut-être que cette config besoin de redémarrer MySQL.
Réponses précédentes ne fonctionne pas avec mon problème. C'est seulement dans la production, avec tomcat et apache mod_proxy_ajp. Post corps perdu non ascii caractères par ?
Le problème est finalement avec la JVM defaultCharset (US-ASCII par défaut instalation: jeu de caractères dfset = jeu de caractères.defaultCharset();)
donc, la solution a été exécuté serveur tomcat avec un modificateur pour exécuter la JVM avec l'UTF-8 comme jeu de caractères par défaut:
(ajoutez cette ligne à catalina.sh et le service tomcat redémarrer)
Peut-être que vous devez également modifier le système linux variable (éditer ~/.bashrc et ~/.profil permanente de l'évolution, voir https://perlgeek.de/en/article/set-up-a-clean-utf8-environment)
Face à la même question sur Spring MVC 5 + Tomcat 9 + JSP.
Après le long travail de recherche, est venu à une solution élégante (pas besoin filtres et pas besoin changements dans le Tomcat server.xml (à partir de 8.0.0-RC3 version))
Dans le WebMvcConfigurer mise en œuvre définir le codage par défaut pour messageSource (pour la lecture de données à partir de messages de fichiers source dans le codage UTF-8.
Dans le DispatcherServletInitializer de mise en œuvre de @Override la onStartup de la méthode et de l'ensemble de la demande et des ressources de codage de caractères en informatique.
Enregistrer tous les messages de la source et de visualiser des fichiers en UTF-8.
Ajouter <%@ page contentType="text/html;charset=UTF-8" %> ou <%@ page pageEncoding="UTF-8" %> dans chaque *.fichier jsp ou ajouter jsp-config descripteur de web.xml
Dans le cas où vous avez spécifié dans le pool de connexion (mysql-ds.xml), dans votre code Java que vous pouvez ouvrir la connexion comme suit: