Saisie Unicode récupéré via PrimeFaces d'entrée des composants sont endommagés
Quand j'étais encore à l'aide de PrimeFaces v2.2.1, j'ai pu type de saisie unicode comme le Chinois avec un PrimeFaces composant d'entrée tels que <p:inputText>
et <p:editor>
, et récupérer l'entrée en forme de managed bean méthode.
Cependant, après j'ai mis à PrimeFaces v3.1.1, tous ces personnages deviennent Mojibake ou des points d'interrogation. Que le Latin d'entrée vient fine, ce sont les Chinois, arabe, hébreu, Cyrillique, etc. personnages qui deviennent difformes.
Comment est-il la cause et comment puis-je le résoudre?
OriginalL'auteur Mr.J4mes | 2012-03-09
Vous devez vous connecter pour publier un commentaire.
Introduction
Normalement, JSF/Facelets va définir le paramètre de la requête de codage de caractères UTF-8 par défaut déjà lorsque la vue est créé ou restauré. Mais si aucun paramètre de la requête est été demandé avant la vue est été créé/restauré, il est alors trop tard pour régler correctement l'encodage des caractères. Les paramètres de la requête va savoir être analysée qu'une seule fois.
PrimeFaces encodage échouer
Qu'il a échoué dans PrimeFaces 3.x après la mise à niveau à partir de 2.x est causée par la nouvelle
isAjaxRequest()
remplacer dans le PrimeFaces'PrimePartialViewContext
qui vérifie les paramètres de la requête:Par défaut, le
isAjaxRequest()
(l'un des Mojarra/MyFaces, comme ci-dessus PrimeFaces code a obtenu pargetWrapped()
) vérifie l'entête de la requête comme suit, qui n'a pas d'incidence sur la demande d'encodage des paramètres en tant que paramètres de la requête ne sera pas interprété lors d'un en-tête de requête est obtenu:Cependant, la
isAjaxRequest()
peut être appelée par n'importe quelle phase de l'écouteur ou du système d'écouteur d'événement ou une application en usine avant la vue est été créé/restauré. Donc, quand vous êtes à l'aide de PrimeFaces 3.x, alors les paramètres de la demande sera analysée avant le bon encodage des caractères est définie et donc d'utiliser la valeur par défaut du serveur d'encodage qui est généralement de l'ISO-8859-1. Cela gâchera tout.Solutions
Il existe plusieurs façons de résoudre le problème:
Utiliser un filtre de servlet qui définit
ServletRequest#setCharacterEncoding()
avec l'encodage UTF-8. Réglage de la réponse de l'encodage parServletResponse#setCharacterEncoding()
est d'ailleurs inutile, car il ne sera pas affecté par ce problème.Vous avez seulement besoin de prendre en compte le fait que
HttpServletRequest#setCharacterEncoding()
seulement définit l'encodage pour les POSTES les paramètres de la demande, non pas pour OBTENIR les paramètres de la demande. Pour OBTENIR les paramètres de la demande que vous souhaitez toujours besoin de le configurer au niveau du serveur.Si vous arrive d'utiliser JSF bibliothèque utilitaire OmniFaces, un tel filtre est déjà fournis à l'extérieur de la boîte, le
CharacterEncodingFilter
. Il suffit de l'installer comme ci-dessous dansweb.xml
comme première entrée de filtre:Reconfigurer le serveur pour utiliser l'UTF-8 au lieu de ISO-8859-1 comme encodage par défaut. En cas de Glassfish, ce serait une question d'ajouter l'entrée suivante à
<glassfish-web-app>
de la/WEB-INF/glassfish-web.xml
fichier:Tomcat ne le supporte pas. Il a la
URIEncoding
attribut dans<Context>
entrée, mais cela s'applique à des demandes seulement, pas pour les requêtes POST.Comme le rapport d'un bug de PrimeFaces. Est-il vraiment aucune raison légitime pour vérifier que la requête HTTP d'être une requête ajax par le contrôle d'un paramètre de la requête au lieu d'un en-tête de requête comme comme vous le feriez pour la norme ACI et par exemple jQuery? Le PrimeFaces'
core.js
JavaScript est en train de faire. Il serait mieux si elle a le définir comme un en-tête de demande deXMLHttpRequest
.Des Solutions qui ne fonctionnent PAS
Peut-être que vous allez tomber sur ci-dessous de "solutions" quelque part sur l'Internet lors de l'enquête sur ce problème. Ces solutions ne ne jamais travailler dans ce cas précis. Explication de la façon suivante.
Réglage de prologue XML:
Cela n'indique que l'analyseur XML pour utiliser UTF-8 pour décoder le source XML avant de créer l'arborescence XML autour d'elle. L'analyseur XML utilisés par Facelts est SAX pendant JSF vue le temps de construction. Cette partie a complètement rien à voir avec de requête/réponse HTTP encodage.
Paramètre HTML de la balise meta:
Le code HTML de la balise meta est ignoré lorsque la page est servi sur HTTP via un
http(s)://
URI. C'est seulement lorsque la page est par le client enregistré comme un fichier HTML sur le disque local du système et ensuite rouvert en unfile://
URI dans le navigateur.Paramètre de formulaire HTML accepter attribut charset:
Les navigateurs modernes ignorer cela. Cela n'a d'effet que dans le navigateur Microsoft Internet Explorer. Même alors, il le fait à tort. Ne jamais l'utiliser. Tous les vrais navigateurs internet, utilise le jeu de caractères de l'attribut spécifié dans le
Content-Type
en-tête de la réponse. Même MSIE va faire de la bonne façon, tant que vous ne spécifiez pas leaccept-charset
attribut.Réglage de l'argument JVM:
Ce n'est utilisé que par l'Oracle(!) La JVM de lire et d'analyser les fichiers source Java.
p:commandButton
avant de trouver la solution de filtre. Votre enquête a prouvé. C'est un bug grave depuis le mauvais caractères codés dupliqué lui-même chaque fois que vous cliquez sur le bouton enregistrer.Désolé pour la réponse tardive. Je viens de tester vos solutions aujourd'hui. La 2ème solution ne résout pas le problème. J'ai aussi essayé d'utiliser la
filter
mais il ne fonctionne pas aussi bien. Actuellement, il y a 2 filtres à ma demande: PrimeFaces est Fileupload de Filtre et de mon propre filtre. J'ai ajoutéHttpServletRequest#setCharacterEncoding()
dans mon propre filtre. Si PrimeFaces du filtre est appelé avant l'autre, il sera à l'origine du problème?Votre problème semble être uniquement liés à l'utilisation de
System.out.println()
pour imprimer les données soumises. Est le stdout (là où lesSystem.out
va écrire) également configuré pour utiliser UTF-8? Dans Eclipse, vous pouvez le mettre dans Window > Préférences > Général > espace de travail > Texte d'encodage de fichier. Veuillez noter que l'utilisation de deux le filtre et la configuration du serveur n'est pas nécessaire. L'une des deux est suffisant.La DB persistance problème semble être uniquement liées à l'encodage des caractères de la connexion JDBC. Il est également configuré pour utiliser UTF-8? MySQL, par exemple, est connu pour mal utiliser la plate-forme client de l'encodage à la place. De toute façon pour résoudre ce problème et des problèmes à l'avenir, merci de lire balusc.blogspot.com/2009/05/...
En fait, j'ai suivi ce post et re-créé à l'ensemble de la base de données en UTF-8 jeu de caractères. Cependant, je suis bloqué à la partie où je dois mettre
useUnicode=yes&characterEncoding=UTF-8
pour la connexion JDBC. J'ai créé mon pool de connexions JDBC JDBC et des ressources à l'aide de la console d'administration de GlassFish. Pourriez-vous svp me dire comment je peux appliquer le au-dessus de 2 propriétés à mes connexions JDBC?OriginalL'auteur BalusC