我对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
如何正确设置字符编码?
答案 0 :(得分:29)
来自HttpServletRequest#getQueryString() javadoc:
<强>返回强>: 包含查询字符串的String;如果URL不包含查询字符串,则返回null。 容器不会解码该值。
请注意最后一句话。所以你需要URL-decode使用java.net.URLDecoder。{/ p>
String queryString = URLDecoder.decode(request.getQueryString(), "UTF-8");
但是,收集参数的常规方法是使用HttpServletRequest#getParameter()。
String param = request.getParameter("param"); // così
如果您已将servletcontainer配置为使用正确的编码,则servletcontainer已经为您进行了URL解码。 request.setCharacterEncoding()
仅对请求主体(POST)有效,而不对请求URI(GET)有影响。另见Mirage的答案。
答案 1 :(得分:27)
之前我遇到过同样的问题。不确定你正在使用什么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)到参数图中。
希望这有帮助!
答案 2 :(得分:20)
这真的花了一整天但是:
final String param = new String(request.getParameter("param").getBytes(
"iso-8859-1"), "UTF-8");
另见here。请注意,这是有效的 iff 服务器的解码字符集(tomcat中的URIEncoding
)是iso-8859-1
- 否则必须传入此字符集。有关如何获取的示例来自Tomcat 7的URIEncoding
的{{1}}字符集请参阅我引用的answer
答案 3 :(得分:3)
对于POST请求,我下一步解决了问题。
最后,我有正确的utf-8字符: 例如String name = request.getParameter(&#34; name&#34;);
name包含正确的utf-8字符串。
答案 4 :(得分:1)
影响http请求参数编码的因素很多。你可以参考这个问题的顺序指南。
1.检查表单的接受字符编码。
<form id="edit-box" name="edit-box-name" method="post" accept-charset="UTF-8">
2.检查http服务器的默认字符编码值。
对于apache http server,将"AddDefaultCharset UTF-8"
字符串添加到httpd.conf文件。
3.如果您有后端服务器,请检查后端服务器的字符编码值。 在tomcat后端服务器的情况下,将“URIEncoding =”UTF-8“属性添加到您的连接器。比如,
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"/>
...