2010-06-12 80 views
29

我有一些UTF-8的问题。我的客户(在GWT实现)提出请求,以我的servlet,在URL中的一些参数应用,如下:request.getQueryString()似乎需要一些编码

http://localhost:8080/servlet?param=value 

当我取回URL servlet的,我有一些问题,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 

我能做些什么来设置正确的字符编码?

回答

27

我以前遇到过这个问题。不知道你使用的是什么Java servlet容器,但至少在Tomcat 5.x中(不确定大约是6.x)request.setCharacterEncoding()方法对GET参数没有影响。当你的servlet运行时,GET参数已经被Tomcat解码,所以setCharacterEncoding不会做任何事情。

两种方式来解决这个问题:

  1. 更改的URIEncoding您的连接器设置为UTF-8。见http://tomcat.apache.org/tomcat-5.5-doc/config/http.html

  2. 由于BalusC建议您自己解码查询字符串,并手动将它解析(而不是使用ServletRequest API)到您自己的参数映射中。

希望这有助于!

+4

#1中的URIEncoding设置位于Tomcat的server.xml中。其他servlet容器应合理地具有相同的设置。 – schematic 2010-06-12 17:10:48

+1

对于#2,您不能再使用request.getParameter()方法,因为该方法将检索错误解码的参数。您必须将解码后的查询字符串(由getQueryString()生成)手动解析(例如,按照&符号分割字符'&',然后将结果字符串拆分第一个等号'=')。 – schematic 2010-06-12 17:13:52

+2

我遇到了server.xml设置的问题。在Windows机器上它工作正常,但在我们生产的基于Red Hat的机器上,Tomcat似乎忽略了server.xml设置。我们最终不得不实现我们自己的查询参数解析器,它使用UTF-8明确解码它。 – Herms 2010-06-12 17:29:01

28

HttpServletRequest#getQueryString() javadoc

返回: 包含查询字符串或null如果URL中不包含查询字符串的字符串。 该值不由容器解码。

请注意最后一条语句。所以你需要URL-decode它你自己使用java.net.URLDecoder

String queryString = URLDecoder.decode(request.getQueryString(), "UTF-8"); 

但是,收集参数的正常方法是使用HttpServletRequest#getParameter()

String param = request.getParameter("param"); // così 

servletcontainer已经为您进行了网址解码,然后如果您已经配置它使用正确的编码。 request.setCharacterEncoding()仅对请求主体(POST)有效,而不在请求URI(GET)上。另请参阅Mirage的答案。

+0

如果我使用他们的工作URLDecoder,但是当我只想检索使用getParameter()的参数,他们没有工作..有什么建议? – Gabriele 2010-06-12 17:08:07

+1

您需要设置Mirage114解释的服务器URI编码。另请参阅[本文](http://balusc.blogspot.com/2009/05/unicode-how-to-get-characters-right.html#JSPServletRequest) – BalusC 2010-06-12 17:13:09

+1

所以'getParameter()'不会调用'URLDecoder.decode ()'某个地方? – 2012-10-06 22:12:36

20

这真的花了一整天,但:

final String param = new String(request.getParameter("param").getBytes(
       "iso-8859-1"), "UTF-8"); 

又见here。请注意,这是有效的当且仅当服务器的解码字符集(URIEncoding在Tomcat中)被iso-8859-1 - 否则此charset必须传入有关如何从server.xml获得URIEncoding字符集为Tomcat 7的例子中看到我的报价answer

+0

这是依赖于服务器的默认字符集是UTF-8;而是将该字符集传递给字符串构造函数。你也不需要URL解码来自'getParameter'的任何东西。 – bobince 2013-06-20 14:12:56

+0

@bobince:你说的很对(我知道) - 我还没有找到时间去阅读我的答案 - 编辑 – 2013-06-20 14:25:23

+2

这节省了我的一天! – NumberFour 2015-05-26 21:22:36

1

影响http请求params编码的因素很多。你可以参考这个问题的顺序指南。

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"/> 

...

guide for http request parameter encoding problems

3

对于POST请求我解决了问题下方式

  1. 集的URIEncoding = “UTF-8” server.xml中为连接器ATTR;(I使用Tomcat 8)
  2. 在参数检索前设置request.setCharacterEncoding(“UTF-8”)。

最后,我得到了正确的utf-8字符deliery: String name = request.getParameter(“name”);

名称包含正确的utf-8字符串。

-1
pRes.setContentType("text/html; charset=UTF-8"); 
PrintWriter out = new PrintWriter(new (pRes.getOutputStream(), "UTF8"), true); 

使用上面的代码中,我得到了预期的结果:)