HttpServletRequest UTF-8编码

Car*_*gro 36 java encoding utf-8 httprequest

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

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

谢谢

VGR*_*VGR 40

保罗的建议似乎是最好的行动方案,但如果你要解决它,你根本不需要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");
Run Code Online (Sandbox Code Playgroud)

更新:由于获得了很多选票,我想强调BalusC的观点,即这绝对不是解决方案; 这是最好的解决方法.人们不应该这样做.

我不确切知道是什么导致了原始问题,但我怀疑URL已经是UTF-8编码,然后再次进行UTF-8编码.

  • 对于所有未来的读者,请注意这是一种解决方法,而不是解决方案.事实上,这是一个非常可怕的,使你的webapp脆弱和不可移植. (12认同)

Pau*_*gas 26

如果您使用的是Apache Tomcat,则request.setCharacterEncoding("UTF-8")仅适用于POST请求.

对于GET请求,您需要添加URIEncoding="UTF-8"在你<Connector>server.xml.

FAQ/CharacterEncoding中查看更多内容- Tomcat Wiki.

  • @SajibAcharya嗨!-感谢您的单挑。显然是某种[迁移](https://cwiki.apache.org/confluence/display/TOMCAT/Migrated+Content)。但是我们可以在[Archive.org](https://web.archive.org/web/20190618043706/https://wiki.apache.org/tomcat/FAQ/CharacterEncoding#Q2)上看到“原始”。 (2认同)

Car*_*gro 6

好吧,我找到了一种方法来解决我的问题,我想这不是更好的解决方案,但确实有效..

  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
Run Code Online (Sandbox Code Playgroud)

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

PS:保罗,我没有早点回答你,但我已经做过那些事.无论如何,谢谢你的帮助.