Java和JS/AS3中URL解码/编码UTF-8的差异(bug!?)

5
我正在使用Java解码由Javascript或Actionscript 3编码的UTF-8字符串时遇到问题。我设置了一个测试用例如下:
所涉及的字符串是“Produktgröße”
当我使用JS / AS3进行编码时,我得到以下字符串:
escape('Produktgröße')

这段文本是关于产品大小的。当使用JS解码时,它没有任何变化。
unescape('Produktgr%F6%DFe')

Produktgröße

所以,我假设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/>

产品规格

产品尺寸

产品大小

产品尺寸

产品大小

你有什么想法,为什么这些语言存在差异,以及为什么JS/AS3的行为与您的预期不同吗?

谢谢。

3个回答

10

escape 是一个已经被弃用的函数,不能正确地编码 Unicode 字符。建议使用 encodeURI 或者 encodeURIComponent,后者可能更适合你的需求。


1

我一直在为这个问题苦苦挣扎了好几个小时......我的问题是一个 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后端解码它...

解决方案如下:

  • 在JS端使用var encoded = encodeURIComponent(name);进行编码
  • 在Java端使用String decoded = java.net.URLDecoder.decode(encoded, "UTF-8");进行解码

一些参考资料: http://www.programering.com/a/MjN2ADOwATg.html http://www.theerrormessage.com/2013/10/weird-characters-transmitted-to-and-from-server-through-jquery-ajax-call/


1

Javascript使用Latin-1字符集对您的字符串进行URL编码。Java使用UTF-8进行URL编码。

URL编码实际上只是替换它无法识别的字符/字节。例如,即使您坚持使用ASCII字符,(也会被编码为%28。当您开始使用非ASCII字符(任何长度超过7位的字符)时,您还有额外的字符集问题。


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