HttpServletRequest – setCharacterEncoding似乎什么都不做

我试图从请求中读取UTF-8信息。 我使用了“request.setCharacterEncoding(”UTF-8“);”,但似乎什么也没做 – 信息读取是非UTF-8。

我究竟做错了什么?

如果您使用的是tomcat,还应该在连接器中将URIEncoding设置为UTF-8:

 ...        

HttpServletRequest#setCharacterEncoding()仅在请求是POST请求 尚未处理请求正文时才有效。

因此,如果它在您的情况下不起作用,那么它可能有两个原因:

  1. 你实际上正在发出一个GET请求。 即请求参数在请求URL而不是请求主体中从客户端发送到服务器。 请求URL由Web服务器处理,而不是由Servlet API处理。 因此,要解决此问题,您需要配置相关的Web服务器,以使用指定的字符编码对请求URL(URI)进行解码。 例如,在Apache Tomcat的情况下,您需要将server.xml 元素的URIEncoding属性设置为UTF-8

  2. 您正确使用POST ,但您已经(间接)处理了请求正文,因此更改字符编码为时已晚。 只有在第一次调用getParameterXXX()方法时,才会完全处理请求体。 有几个 。 它不会在后续调用中重新处理。 当确定谁在调用此方法时,不要忘记考虑web.xml所有已声明的Filter实例。 其中一些人可能会抓取并扫描参数。

如果这仍然没有任何帮助,那么剩下的唯一可能原因是显示控制台或记录器或者你用来打印/确定/调试获得的请求参数的任何东西都不支持UTF-8。 您想重新配置控制台/记录器/ etc以使用UTF-8来显示字符。 如果它是例如Eclipse控制台,则可以通过Window> Preferences> General> Workspace> Text File Encoding来设置它。

也可以看看:

  • Unicode – 如何使角色正确? 更多背景信息,实际示例和解决方案。

这种方法真是太愚蠢了。 它不应该存在,你不应该使用它。

对于POST请求中的正文,编码应该由Content-Type标头中的客户端明确定义。 如果没有,这是一个糟糕的要求。 [1]

对于GET请求URI,客户端不能指定编码,并且服务器必须具有隐式编码,并且程序员需要设置编码,但Servlet API中不存在该方法!

但是,servlet容器可以采用专有的方式来实现。

最好的方法可能是将JVM的默认编码设置为UTF-8。

1: http : //www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.7.1

“charset”参数与某些媒体类型一起用于定义数据的字符集(第3.4节)。 当发送方未提供显式字符集参数时,“文本”类型的媒体子类型被定义为在通过HTTP接收时具有默认字符集值“ISO-8859-1”。 除“ISO-8859-1”或其子集之外的字符集中的数据必须用适当的字符集值标记。

问题取决于使用的应用程序服务器。 最好的描述,我在这个链接中找到。

在某些应用程序服务器中,在使用描述符设置应用程序编码之前, request.setCharacterEncoding(...)无效。 最复杂的是JBoss,Apache Tomcat,Glassfish。 更好的是WebLogic,最好的是Jetty(UTF-8是默认设置)。

在我的情况下,我必须创建一个glassfish-web.xml描述符,并在其中放置parameter-encoding标记。 就我而言,对于GlassFish:

     

只是为了确认对于POST参数,你必须在获取参数之前调用request.setCharacterEncoding(...) 。 对于GET参数,它取决于您正在使用的Web容器(使用Maurice Perry对Tomcat的回答)。

请查看此链接以获取更多信息。 “从浏览器到数据库的字符转换” http://java.sun.com/developer/technicalArticles/Intl/HTTPCharset/

你在任何request.getParameter调用之后做的吗?

request.setCharacterEncoding("UTF-8")必须在任何request.getParameter()调用之前调用。

(至于第一个问题..)
如果您从正文中读取参数,也可以使用自己的编码读取每个项目(查看最后一行):

 ServletFileUpload upload = new ServletFileUpload(new DiskFileItemFactory()); List items = null; try { items = upload.parseRequest(request); } catch (FileUploadException ex) { logger.warn("Fail during file upload"); return uploads; } Iterator itr = items.iterator(); while (itr.hasNext()) { FileItem item = (FileItem) itr.next(); if (item.isFormField()) { String name = item.getFieldName(); System.out.println("name: " + name); String value = item.getString(); System.out.println("get as utf8 - "+item.getString("UTF-8")); 

对于jboss / wildfly,有一个function请求https://issues.jboss.org/browse/WFLY-2533

将其放入WEB-INF / jboss-web.xml:

    UTF-8