【问题标题】:encodeURIComponent appears to add a character to my stringencodeURIComponent 似乎在我的字符串中添加了一个字符
【发布时间】:2015-01-24 08:26:51
【问题描述】:

jQuery.ajax() 在转义我的数据时做了一些奇怪的事情。

例如,如果我发送请求:

$.ajax({
    url: 'somethinguninteresting',
    data: {
        name: 'Ihave¬aweirdcharacter';
    }
});

然后调查 Chrome devtools 中的 XHR,它显示“请求有效负载”为 name=Ihave%C2%ACaweirdcharacter

现在,我想通了:

'¬'.charCodeAt(0) === 172

172 是十六进制的AC

向后工作,十六进制的C2(前置的“额外”字符)是十进制的 194,而

String.fromCharCode(194) === 'Â'

我的问题:

为什么

encodeURIComponent('¬')

返回'%C2%AC',这将看起来是调用的结果

encodeURIComponent('¬')

(它本身返回'%C3%82%C2%AC')?

【问题讨论】:

    标签: javascript jquery ajax character-encoding encodeuricomponent


    【解决方案1】:

    虽然 JavaScript 在内部使用 UTF-16(或 UCS-2),但它执行基于 UTF-8 的 URI 编码。

    172的序数值用两个字节编码,因为它不能再用ASCII来表示了; UTF-8 中的两字节编码是这样完成的:

    110xxxxx 10xxxxxx
    

    x的地方我们填入172的二进制表示,即10101100:

    11000010 10101100 = C2AC
       ^^^
       pad
    

    然后这个结果被百分比编码,最终形成%C2%AC,这就是您在请求负载中看到的内容。

    【讨论】:

    • 啊——所以实际上只是巧合——第二个字节恰好是二进制的 172!那是真的让我失望。谢谢你的解释。我认为您的“^^^ pad”偏离了一个字符是否正确?
    • @AlexMcMillan 嗯,它已经关闭了.. ascii 艺术错误 ;-)
    • 非常好,当它在视觉上这样描述时更容易理解。谢谢
    【解决方案2】:

    Url 编码(或percent encoding),使用UTF-8 对unicode 字符进行编码。 UTF-8 对具有不同字节数的字符进行编码。 ¬ 字符在 UTF-8 中编码为 C2 AC

    charCodeAt 方法不处理多字节序列。有关如何使用 charCodeAt 使用 UTF-8 对字符串进行编码的更多详细信息,请参阅此答案 https://stackoverflow.com/a/18729931/4231110

    简而言之,%C2%AC 是正确的 ¬ 百分比编码。这可以通过运行来证明

    decodeURIComponent('%C2%AC') // '¬'
    

    【讨论】:

    • C2 AC 是十六进制或 base16 编码,而不是 UTF-8。
    • @AlexanderO'Mara 我不关注。 unicode 字符是U+00AC,它以 UTF-8 编码为十六进制字符串 C2AC,或者如果您愿意,可以使用二进制序列 1100001010101100。
    • ¬%C2%AC 的转换在技术上是 base16 编码。 C2 AC¬ 在 UTF-8 编码中的十六进制表示。
    • %C2%AC¬ w3schools.com/tags/ref_urlencode.asp 的直接utf8 编码我不明白为什么会混淆或weird
    • 通过 AJAX 将纯文本字符串从浏览器发送到服务器似乎是 大量 的麻烦,类似的东西不会出现在任何类似的 javascript 中我看过/读过。在上面的示例中,我将发送什么值作为data.name 以获得预期的结果(即正确发送字符串)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-13
    • 1970-01-01
    • 2013-10-27
    • 2011-04-22
    • 1970-01-01
    • 2010-12-01
    相关资源
    最近更新 更多