【问题标题】:Difference in URL decode/encode UTF-8 between Java and JS/AS3 (bug!?)Java 和 JS/AS3 之间 URL 解码/编码 UTF-8 的差异(错误!?)
【发布时间】: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 的行为不像我预期的那样吗?

谢谢。

【问题讨论】:

    标签: java javascript encoding unicode-escapes


    【解决方案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/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多