我有一个接收一些 POST 数据的 servlet。因为此数据是 x-www-form-urlencoded,所以诸如 sabon 之类的字符串将被编码为 サボテン。
我如何将此字符串解编码回正确的字符?我尝试过使用URLDecoder.decode("encoded string", "UTF-8");
,但没有任何区别。
我想取消编码的原因是,在我在网页上显示这些数据之前,我将 & 转义为 & 目前,它正在转义编码字符串中的 &s,因此字符无法正确显示。
我有一个接收一些 POST 数据的 servlet。因为此数据是 x-www-form-urlencoded,所以诸如 sabon 之类的字符串将被编码为 サボテン。
我如何将此字符串解编码回正确的字符?我尝试过使用URLDecoder.decode("encoded string", "UTF-8");
,但没有任何区别。
我想取消编码的原因是,在我在网页上显示这些数据之前,我将 & 转义为 & 目前,它正在转义编码字符串中的 &s,因此字符无法正确显示。
这些不是 URL 编码。它看起来像%E3%82%B5%E3%83%9C%E3%83%86%E3%83%B3
。这些是十进制 HTML/XML 实体。要取消转义 HTML/XML 实体,请使用Apache Commons Lang StringEscapeUtils
。
根据评论更新:当响应编码不是 UTF-8 时,您会得到问号。如果您使用 JSP,只需将以下行添加到页面顶部:
<%@ page pageEncoding="UTF-8" %>
有关更多详细信息,请参阅本文中途的解决方案。我更喜欢使用 UTF8-all-the-way 而不是摆弄正则表达式,因为正则表达式不会让你为统治世界做好准备。
这是浏览器的功能/错误。如果网页是有限的字符集,比如 ASCII,并且用户在表单字段中输入了一些字符集之外的字符,浏览器将以以下形式发送这些字符$#xxxx;
这可能是一个问题,因为如果用户实际键入$#xxxx;
,他们将按原样发送。所以服务器没有办法区分这两种情况。
最好的方法是使用一个涵盖所有字符的字符集,比如 UTF-8,这样浏览器就不会这样做了。
只是一个疯狂的猜测,但是您使用的是 Tomcat 吗?
如果是这样,请确保您已在 Tomcat 中使用 UTF-8 的 URIEncoding 设置连接器。在网上谷歌一下,你会发现大量的点击,比如
正则表达式怎么样?
Pattern pattern = Pattern.compile("&([^a][^m][^p][^;])?");
Matcher matcher = pattern.matcher(inputStr);
String output = matcher.replaceAll("&$1");