2013-05-13 74 views
27

我看到很多像我这样的问题,但没有一个答案的作品... 这是事情:我想从请求中获取我的参数(带有口音的字符),但它不起作用。我试图用户request.setCharacterEncoding("UTF-8"),但它也没有工作。HttpServletRequest UTF-8编码

我知道URLDecoder.decode(request.getQueryString(), "UTF-8")返回我的权利字符,但request.getParameterValues()不起作用! 有没有人有想法?

谢谢

回答

34

保罗的建议似乎是最佳行动过程,但如果你要解决它,你并不需要的URLEncoder或URLDecoder都:

String item = request.getParameter("param"); 

byte[] bytes = item.getBytes(StandardCharsets.ISO_8859_1); 
item = new String(bytes, StandardCharsets.UTF_8); 

// Java 6: 
// byte[] bytes = item.getBytes("ISO-8859-1"); 
// item = new String(bytes, "UTF-8"); 

更新:由于这是得到大量的选票,我想强调BalusC的观点,这绝对不是一个解决方案;这是一个最好的解决方法。人们不应该这样做。

我不知道到底是什么原因引起的问题,但我怀疑这个URL已经是UTF-8编码了,然后又是UTF-8编码了。

+9

对于所有未来的读者,请注意,这是一种解决方法,而不是解决方案。事实上,这是一个非常糟糕的问题,它会让你的webapp变得脆弱和不可移植。 – BalusC 2014-12-27 10:07:03

+0

你说得对,谢谢指出!也帮助我解决问题 – Broccoli 2017-02-25 19:51:40

15

如果您正在使用Apache Tomcat,request.setCharacterEncoding("UTF-8")只有POST要求的作品。

对于GET请求,您需要在的<Connector>上添加URIEncoding="UTF-8"

查看更多的FAQ/CharacterEncoding - Tomcat Wiki

+0

WebSphere Application Server如何?我可否知道server.xml位于WAS中的哪个文件夹?我搜索整个,发现有很多server.xml。 – 2016-04-06 06:46:55

+0

对于WebSphere,您需要使用系统属性'client.encoding.override'。请参阅https://www.ibm.com/support/knowledgecenter/en/ssw_i5_54/rzatz/51/admin/help/trun_svr_utf.html – 2017-12-26 19:32:05

5

嗯,我找到了一种方法来解决我的问题,我想这是不是更好的解决方案,但它确实工作..

String item = request.getParameterValues("param"); // Hélène 
    item = URLEncoder.encode(model.getNameItem(), "ISO-8859-1"); // H%C3%A9l%C3%A8ne 
    item = URLDecoder.decode(item, "UTF-8"); // and finally : Hélène 

如果它可以帮助别人,我很乐意帮助: )

PS:保罗,我以前没有回答你,但我已经做了这些事情。无论如何,感谢您的帮助。

+0

从Paul答复,我可以知道server.xml位于WAS中的哪个文件夹?我搜索整个,发现有很多server.xml。 – 2016-04-06 06:47:49

+0

为我工作,thx。我无法修改Tomcat服务器,所以这是完美的:) – 2016-09-27 15:09:58