Java 和 JS/AS3 之间 URL 解码/编码 UTF-8 的差异(错误!?)
Posted
技术标签:
【中文标题】Java 和 JS/AS3 之间 URL 解码/编码 UTF-8 的差异(错误!?)【英文标题】:Difference in URL decode/encode UTF-8 between Java and JS/AS3 (bug!?) 【发布时间】:2011-09-02 03:46:00 【问题描述】:我在用 javascript 或 Actionscript 3 编码的 Java 中对 UTF-8 字符串进行 URL 解码时遇到问题。我设置了一个测试用例,如下所示:
有问题的字符串是 Produktgröße
当我使用 JS/AS3 编码时,我得到以下字符串:
escape('Produktgröße')
Produktgr%F6%DFe
当我用 JS 取消转义时,我没有得到任何改变
unescape('Produktgr%F6%DFe')
Produktgr%F6%DFe
所以,我假设 JS 没有正确编码字符串??
下面的 JSP 产生这个输出
<%@page import="java.net.URLEncoder"%>
<%@page import="java.net.URLDecoder"%>
<%=(URLDecoder.decode("Produktgr%F6%DFe","UTF-8"))%><br/>
<%=(URLEncoder.encode("Produktgröße","UTF-8"))%><br/>
<%=(URLEncoder.encode("Produktgröße"))%><br/>
<%=(URLDecoder.decode(URLEncoder.encode("Produktgröße")))%><br/>
<%=(URLDecoder.decode(URLEncoder.encode("Produktgröße"),"UTF-8"))%><br/>
产品目录
Produktgr%C3%B6%C3%9Fe
Produktgr%C3%B6%C3%9Fe
产品目录
产品目录
知道为什么我的语言存在这种差异以及为什么 JS/AS3 的行为不像我预期的那样吗?
谢谢。
【问题讨论】:
【参考方案1】:escape 是一个不推荐使用的函数,并且不能正确编码 Unicode 字符。使用encodeURI 或encodeURIComponent,后者可能是最适合您需要的方法。
【讨论】:
谢谢,这就是我要找的答案!【参考方案2】:Javascript 是使用 Latin-1 字符集对您的字符串进行 URL 编码。 Java 使用 UTF-8 对其进行 URL 编码。
URL 编码实际上只是替换了它无法识别的字符/字节。例如,即使您坚持使用 ASCII 字符,(
也会被编码为 %28
。当您开始使用非 ASCII 字符(任何超过 7 位的字符)时,您会遇到字符集的额外问题。
【讨论】:
【参考方案3】:我已经为这个问题苦苦挣扎了好几个小时... 我的问题是一个 JQuery Ajax 调用,例如:
return $.ajax(
url: '/author!getAuthorContent.action',
type: 'GET',
data : author:name, 'content_type': ct || 'all', 'start': start || 0
);
'name' 是一个字符串,其中包含 Jérôme-Serrano 等特殊字符
由于某些原因,JS/JQuery 编码这些特殊字符的方式不兼容,我无法在 Java BackEnd 上对其进行解码...
解决办法是:
使用var econded = encodeURIComponent(name);
在JS端编码
使用String decoded = java.net.URLDecoder.decode(econded ,"UTF-8");
在Java端解码它们
一些参考: http://www.programering.com/a/MjN2ADOwATg.html http://www.theerrormessage.com/2013/10/weird-characters-transmitted-to-and-from-server-through-jquery-ajax-call/
【讨论】:
以上是关于Java 和 JS/AS3 之间 URL 解码/编码 UTF-8 的差异(错误!?)的主要内容,如果未能解决你的问题,请参考以下文章