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 字符。使用encodeURIencodeURIComponent,后者可能是最适合您需要的方法。

【讨论】:

谢谢,这就是我要找的答案!【参考方案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 的差异(错误!?)的主要内容,如果未能解决你的问题,请参考以下文章

Java:编写自定义视频编解码器的指南 [关闭]

Java 使用URLEncoder.encode和URLDecoder.decode编解码(utf-8)中文及特殊字符

python3url编解码base64编解码ASE加解密

netty编解码之java原生序列化

markdown URL编解码

url编解码