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

时间:2011-05-25 22:02:34

标签: java javascript encoding unicode-escapes

我有一个问题URL解码Java中的UTF-8字符串,该字符串使用Javascript或Actionscript 3进行编码。我已按如下方式设置测试用例:

有问题的字符串是Produktgröße

当我用JS / AS3编码时,我得到以下字符串:

escape('Produktgröße')

Produktgr%F6%DFE

当我用JS解决这个问题时,我没有改变

unescape('Produktgr%F6%DFe')

Produktgr%F6%DFE

因此,我假设JS没有正确编码字符串??

以下JSP生成此outupt

<%@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的ΔE

Produktgr%C3%B6%C3%9FE

Produktgr%C3%B6%C3%9FE

Produktgröße

Produktgröße

知道为什么我与语言存在这种差异以及为什么JS / AS3没有按照我的预期行事?

感谢。

3 个答案:

答案 0 :(得分:10)

escape 是一个已弃用的函数,无法正确编码Unicode字符。使用encodeURIencodeURIComponent,后者可能是最适合您需求的方法。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

我几个小时一直在努力解决这个问题...... 我的问题是JQuery Ajax调用,如:

<img ng-click="getDocsForCategory(benefit)" ng-src="/ppt/assets/toolIcons/{{benefit.img}}" height="165"><br/>

'name'是一个包含特殊字符的字符串,如Jérôme-Serrano

由于某些原因,JS / JQuery编码这些特殊字符的方式是不兼容的,我无法在Java BackEnd上解码它...

解决方案是:

  • 使用return $.ajax({ url: '/author!getAuthorContent.action', type: 'GET', data : {author:name, 'content_type': ct || 'all', 'start': start || 0} });
  • 在JS端编码
  • 使用var econded = encodeURIComponent(name);
  • 在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/