HttpServletRequest – setCharacterEncoding似乎什么都不做
我试图从请求中读取UTF-8信息。 我使用了“request.setCharacterEncoding(”UTF-8“);”,但似乎什么也没做 – 信息读取是非UTF-8。
我究竟做错了什么?
如果您使用的是tomcat,还应该在连接器中将URIEncoding设置为UTF-8:
...
HttpServletRequest#setCharacterEncoding()
仅在请求是POST
请求且 尚未处理请求正文时才有效。
因此,如果它在您的情况下不起作用,那么它可能有两个原因:
-
你实际上正在发出一个
GET
请求。 即请求参数在请求URL而不是请求主体中从客户端发送到服务器。 请求URL由Web服务器处理,而不是由Servlet API处理。 因此,要解决此问题,您需要配置相关的Web服务器,以使用指定的字符编码对请求URL(URI)进行解码。 例如,在Apache Tomcat的情况下,您需要将server.xml
元素的URIEncoding
属性设置为UTF-8
。 -
您正确使用
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