J'ai un tel lien dans la page JSP avec codage BIG5 http: // bonjour / monde? Nom = 婀ㄉ Et quand je l'ai saisi dans la barre d'URL du navigateur, il sera changé à quelque chose comme http: // bonjour / monde? Nom =% 23% 24% 23 Et lorsque nous voulons obtenir ce paramètre dans la page JSP, tous les caractères sont corrompus. P>
Et nous avons mis ceci: demande.setcharacterencoding ("utf-8"), de sorte que toutes les demandes seront converties en UTF8. P>
Mais pourquoi dans ce cas, cela ne fonctionne pas? Merci d'avance!. P>
5 Réponses :
Vous ne pouvez pas avoir de caractères non-ASCII dans une URL - vous avez toujours besoin de les coder pourcentage. Ce faisant, les navigateurs ont des difficultés les rendant. Le rendu fonctionne mieux si vous encodez l'URL dans UTF-8, puis pourcentage-l'encoder. Pour votre URL spécifique, cela donnerait http: // Bonjour / Monde? Nom =% E5% A9% 80% E3% 84% 89 Code>
(vérifiez votre navigateur ce qu'il donne pour ce lien spécifique). Lorsque vous obtenez le paramètre JSP, vous devez explicitement l'absorber, puis le décoder à partir de UTF-8, car le navigateur l'enverra tel. P>
Mais comment puis-je le coder? Changez-le de non-ASCII en pourcentage-Encode? Quelle fonction dois-je utiliser en Java?
Lorsque vous entrez dans l'URL dans la barre d'adresse du navigateur, le navigateur peut convertir le codage du caractère avant l'encodage de l'URL. Cependant, ce comportement n'est pas bien défini, voir ma question,
personnage de manutention Encodage dans URI sur Tomcat P>
Nous obtenons principalement UTF-8 et Latin-1 sur les nouveaux navigateurs, mais nous obtenons toutes sortes de codages (y compris BIG5) chez les anciens. Il est donc préférable d'éviter les caractères non-ASCII dans l'URL entrées par l'utilisateur directement par l'utilisateur. P>
Si l'URL est intégrée dans JSP, vous pouvez le forcer à l'UTF-8 en le générant comme celui-ci, P> xxx pré>
sur tomcat, le codage doit être spécifié sur connecteur comme celui-ci, P>
<Connector port="8080" URIEncoding="UTF-8"/>
Pour éviter de violer avec le pour obtenir ces paramètres sur tomcat Vous devez faire quelque chose comme : p> comme apparemment (?) serveur.xml code> Utiliser:
demande.getparameter code> urldecodes () la chaîne et interprète comme
iso-8859-1 code> - ou quel que soit l'urience code> est défini sur dans le
server.xml code>. Pour un exemple de comment obtenir le
urancoding code> Charset à partir du
server.xml code> pour tomcat 7 Voir ici p> p>
Comment changer le codage par défaut pour le getParameter code>?
@emab: à partir du server.xml code> comme détaillé dans les autres réponses
J'ai eu un problème avec JBoss 7.0, et je pense que cette solution de filtre fonctionne également avec Tomcat:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; HttpServletResponse httpResponse = (HttpServletResponse) response; try { httpRequest.setCharacterEncoding(MyAppConfig.getAppSetting("System.Character.Encoding")); String appServer = MyAppConfig.getAppSetting("System.AppServer"); if(appServer.equalsIgnoreCase("JBOSS7")) { Field requestField = httpRequest.getClass().getDeclaredField("request"); requestField.setAccessible(true); Object requestValue = requestField.get(httpRequest); Field coyoteRequestField = requestValue.getClass().getDeclaredField("coyoteRequest"); coyoteRequestField.setAccessible(true); Object coyoteRequestValue = coyoteRequestField.get(requestValue); Method getParameters = coyoteRequestValue.getClass().getMethod("getParameters"); Object parameters = getParameters.invoke(coyoteRequestValue); Method setQueryStringEncoding = parameters.getClass().getMethod("setQueryStringEncoding", String.class); setQueryStringEncoding.invoke(parameters, MyAppConfig.getAppSetting("System.Character.Encoding")); Method setEncoding = parameters.getClass().getMethod("setEncoding", String.class); setEncoding.invoke(parameters, MyAppConfig.getAppSetting("System.Character.Encoding")); } } catch (NoSuchMethodException nsme) { System.err.println(nsme.getLocalizedMessage()); nsme.printStackTrace(); MyLogger.logException(nsme); } catch (InvocationTargetException ite) { System.err.println(ite.getLocalizedMessage()); ite.printStackTrace(); MyLogger.logException(ite); } catch (IllegalAccessException iae) { System.err.println(iae.getLocalizedMessage()); iae.printStackTrace(); MyLogger.logException(iae); } catch(Exception e) { TALogger.logException(e); } try { httpResponse.setCharacterEncoding(MyAppConfig.getAppSetting("System.Character.Encoding")); } catch(Exception e) { MyLogger.logException(e); } }
Si vous avez également eu un problème similaire, veuillez poser une nouvelle question.
Ce n'est pas une question. J'ai résolu mon problème, ce qui est exactement le même, avec ce filtre.
J'ai fait une fouille de cette question pour que cela puisse aider les autres qui rencontrent le même problème sur Tomcat. Ceci est pris de http://wiki.apache.org/tomcat/faq/characterrencoding . P>
(Comment utiliser UTF-8 partout). P>
code> in server.xml. Références: connecteur HTTP, connecteur AJP. LI>
- Utilisez un filtre de codage de caractères avec le codage par défaut défini sur UTF-8 LI>
- Changez tous vos JSPS pour inclure le nom Chart dans leur contenu de contenu.
Par exemple, utilisez <% @ page contenttype = "Texte / HTML; Charset = UTF-8"%> pour les pages JSP habituelles et
code> pour les pages de la syntaxe XML (AKA JSP Documents). LI>
- Changez tous vos servlets pour définir le type de contenu pour les réponses et inclure le nom Charset dans le type de contenu pour être UTF-8.
Utilisez Response.setContentType ("Texte / HTML; Charset = UTF-8") ou réponse.setcharacterending ("UTF-8"). LI>
- Modifiez toutes les bibliothèques de génération de contenu que vous utilisez (Velocity, Freemarker, etc.) pour utiliser UTF-8 et pour spécifier UTF-8 dans le type de contenu des réponses qu'ils génèrent. Li>
- Désactivez toutes les vannes ou filtres pouvant lire les paramètres de la demande avant que votre filtre de codage de caractères ou JSP ait une chance de définir le codage sur UTF-8. li>
ul>