我在使用 UTF-8 时遇到一些问题。我的客户端(在 GWT 中实现)向我的 servlet 发出请求,并在 URL 中包含一些参数,如下所示:
http://localhost:8080/servlet?param=value
当我在 servlet 中检索 URL 时,UTF-8 字符出现一些问题。 我使用这个代码:
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String reqUrl = request.getRequestURL().toString();
String queryString = request.getQueryString();
System.out.println("Request: "+reqUrl + "?" + queryString);
...
所以,如果我调用这个网址:
http://localhost:8080/servlet?param=così
结果是这样的:
Request: http://localhost:8080/servlet?param=cos%C3%AC
如何正确设置字符编码?
来自 HttpServletRequest#getQueryString() javadoc:
退货: 包含查询字符串的
,如果 URL 不包含查询字符串,则为String
。 该值未被容器解码。null
注意最后一句话。所以你需要使用 java.net.URLDecoder 自行进行 URL 解码。
String queryString = URLDecoder.decode(request.getQueryString(), "UTF-8");
但是,收集参数的正常方法只是使用 HttpServletRequest#getParameter()。
String param = request.getParameter("param"); // così
如果您已将 servlet 容器配置为使用正确的编码,则 servlet 容器已经为您对其进行了 URL 解码。
request.setCharacterEncoding()
仅对请求正文 (POST) 有效,对请求 URI (GET) 无效。如何配置请求 URI (GET) 编码取决于服务器。如果您使用 Tomcat,请前往 如何在 Tomcat 中设置请求编码?
我以前也遇到过同样的问题。 不确定您使用的是什么 Java servlet 容器,但至少在 Tomcat 5.x(不确定 6.x)中,
request.setCharacterEncoding()
方法实际上对 GET 参数没有影响。 当您的 servlet 运行时,Tomcat 已对 GET 参数进行了解码,因此 setCharacterEncoding
不会执行任何操作。
解决这个问题的两种方法:
将连接器的 URIEncoding 设置更改为 UTF-8。 请参阅 http://tomcat.apache.org/tomcat-5.5-doc/config/http.html。
按照 BalusC 的建议,自己解码查询字符串,然后手动将其解析(而不是使用 ServletRequest API)到参数映射中。
希望这有帮助!
对于 POST 请求,我通过以下方式解决了问题。
最后,我得到了正确的 utf-8 字符传递:
例如
String name = request.getParameter("name");
名称包含正确的 utf-8 字符串。
影响http请求参数编码的因素有很多。您可以参考此问题的顺序指南。
1.检查您的表单接受的字符编码。
<form id="edit-box" name="edit-box-name" method="post" accept-charset="UTF-8">
2.检查http服务器默认的字符编码值。 如果是 apache http 服务器,请将
"AddDefaultCharset UTF-8"
字符串添加到 httpd.conf 文件中。
3.如果您有后端服务器,请检查后端服务器的字符编码值。 如果是 tomcat 后端服务器,请在连接器中添加“URIEncoding=”UTF-8”属性。例如,
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"/>
...