Java中URL解码日语字符等

3
我有一个servlet,接收一些POST数据。因为这些数据是x-www-form-urlencoded的,所以像サボテン这样的字符串将被编码为サボテン。
我该如何将这个字符串解码回正确的字符?我尝试使用URLDecoder.decode("encoded string", "UTF-8"),但没有任何变化。
我想要解码它们的原因是,在我将这些数据显示在网页上之前,我会将&转义为&,目前它正在转义编码字符串中的&,因此字符无法正确显示。

BalusC的回答是正确的,关于这个问题应该使用XML实体编码而不是URL编码;但是这个响应实际上是XML吗?如果是的话,应该只使用XML解析器--如果不是,那么服务似乎有问题,因为应该将XML作为XML返回,而不仅仅是文档中的文本片段。 - StaxMan
有没有XML?字符以HTML实体接收并作为HTML发送。 - DanielGibbs
4个回答

5

这些不是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" %>

有关一半的解决方案的更多详细信息,请参见this article。我更喜欢使用UTF8全程而不是摆弄正则表达式,因为正则表达式不能为您的世界统治做准备。


我尝试了StringEscapeUtils,但它会把日文字符转换成问号。因此,我认为我不会对其进行解码和重新编码,而是使用正则表达式来忽略前导的&,在将&替换为&时。 - DanielGibbs
好的,我正在使用servlets而不是JSP,但我会看一下这篇文章。良好的编码绝对比在机器接管时手无足措更可取。 - DanielGibbs
1
@DanieL:在servlet中,执行response.setCharacterEncoding("UTF-8")response.setContentType("text/html;charset=UTF-8");。请注意,在servlet中打印HTML而不是将工作委派给JSP并不是最佳实践... - BalusC
我觉得我可能把事情搞砸了一点,但你的意思是我应该接收带有实体等的字符串,将其解码成UTF-8字符串,并将其用于所有未来的目的(输出、数据库等)? - DanielGibbs
结果证明我需要执行 request.setCharacterEncoding("UTF-8")。希望从这里开始可以让所有东西正常工作。感谢您的所有帮助! - DanielGibbs
显示剩余5条评论

1

这是浏览器的一个特性/错误。如果网页使用了有限的字符集,比如ASCII码,而用户在表单字段中输入了一些超出该字符集范围的字符,浏览器会将这些字符以$#xxxx;的形式发送。

这可能会成为一个问题,因为如果用户实际上输入了$#xxxx;,它们将按原样发送。因此,服务器无法区分这两种情况。

最好的方法是使用覆盖所有字符的字符集,例如UTF-8,这样浏览器就不会使用这个技巧。


0

正则表达式怎么样?

Pattern pattern = Pattern.compile("&([^a][^m][^p][^;])?");
Matcher matcher = pattern.matcher(inputStr);
String output = matcher.replaceAll("&amp;$1");

我认为我将不得不使用正则表达式来替换&为&并忽略HTML实体,但你的方法会将サボテン转换为&69;&08;&86;&31;。 - DanielGibbs
好的,我已经让"&(?!#\d+;)"正常工作了。还有需要做什么修改吗? - DanielGibbs
我刚刚修改了我的示例,替换了匹配的表达式。现在应该可以运行了。 - Byron Whitlock
它能工作,但似乎与replaceAll("&", "&")做的事情相同。我想要做的是将所有的&替换为&,但不包括像サ这样的HTML实体。 - DanielGibbs

0

是的,我已经将URIEncoding设置为UTF-8,但没有任何区别,很可能是因为正如@BalusC所指出的那样,我谈论的是HTML实体,而不是URL编码。 - DanielGibbs
1
Tomcat的URIEncoding适用于HTTP请求第一行中的URI,而不适用于POST请求的正文。 - erickson
没错,它只适用于GET,而不适用于POST。 - BalusC

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