HttpServletRequest - setCharacterEncoding似乎什么都不做

Eri*_*pir 25 java servlets character-encoding

我正在尝试从请求中读取UTF-8信息.我使用了"request.setCharacterEncoding("UTF-8");",但它似乎什么都不做 - 信息读取是非UTF-8.

我究竟做错了什么?

Mau*_*rry 24

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

<Server port="8105" shutdown="SHUTDOWN">
...
    <Service name="Catalina">
        <Connector port="8180" URIEncoding="UTF-8" />
        <Engine name="Catalina" defaultHost="localhost">
            <Host name="localhost" appBase="webapps" />
        </Engine>
    </Service>
</Server>
Run Code Online (Sandbox Code Playgroud)


Bal*_*usC 19

HttpServletRequest#setCharacterEncoding()当该请求是一个仅具有效果POST请求请求正文是尚未处理.

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

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

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

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

也可以看看:


irr*_*ble 5

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

对于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"或其子集之外的字符集中的数据必须用适当的字符集值标记.

  • 告诉负责发送标头的客户端和/或HTTP规范的发明者,强制要求沿内容类型标头发送编码. (3认同)