HttpServletRequest UTF-8 编码

37

我想从请求中获取我的参数(带有重音的字符),但是不起作用。我尝试使用 request.setCharacterEncoding("UTF-8"),但也没有起作用。

我知道 URLDecoder.decode(request.getQueryString(), "UTF-8") 返回正确的字符,但是 request.getParameterValues() 不起作用!

有人有想法吗?

3个回答

42

保罗的建议似乎是最好的行动方案,但如果你要绕过它,你根本不需要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编码。


13
未来的读者请注意,这是一种解决方法,而不是一种解决方案。实际上,这是一种极其糟糕的方法,会使您的 Web 应用程序变得脆弱且不可移植。 - BalusC

30
如果您正在使用Apache Tomcat,request.setCharacterEncoding("UTF-8")仅适用于POST请求。
对于GET请求,您需要在<Connector>中添加URIEncoding="UTF-8"server.xml文件中。
更多信息请参见FAQ/CharacterEncoding - Apache Tomcat wiki space

WebSphere应用服务器怎么样?我能知道WAS中的server.xml文件位于哪个文件夹吗?我搜索了整个文件夹,发现有很多server.xml文件。 - Panadol Chong
使用WebSphere,您需要使用系统属性client.encoding.override。请参见https://www.ibm.com/support/knowledgecenter/en/ssw_i5_54/rzatz/51/admin/help/trun_svr_utf.html。 - Paul Vargas
@PaulVargas 你好,你提供的链接已经失效了,返回404错误。能否请你更新一下资源呢?谢谢! - Sajib Acharya
2
@SajibAcharya 你好!-- 感谢你提醒。显然,这是某种迁移。但我们可以在Archive.org上看到原始内容。 - Paul Vargas

9

我找到了解决我的问题的方法,虽然不是最好的解决方案,但它确实有效。

  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

如果能帮助其他人,我很高兴帮忙 :)
附注:Paul,我没有早些回答你,但我已经完成了那些事情。不管怎样,还是谢谢你的帮助。

从Paul的回答中,我可以知道WAS中的server.xml文件位于哪个文件夹?我已经搜索了整个文件系统,发现有很多server.xml文件。 - Panadol Chong
对我有用,谢谢。我无法修改Tomcat服务器,所以这很完美 :) - Sergio Tx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接