4

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('¬')

return '%C2%AC',这似乎是调用的结果

encodeURIComponent('¬')

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

4

2 回答 2

2

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

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

110xxxxx 10xxxxxx

代替x我们填写172的二进制表示,即10101100:

11000010 10101100 = C2AC
   ^^^
   pad

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

于 2014-11-26T07:16:32.337 回答
0

网址编码(或百分比编码),使用UTF-8对unicode 字符进行编码。UTF-8 对具有不同字节数的字符进行编码。¬ 字符以 UTF-8 编码为C2 AC.

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

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

decodeURIComponent('%C2%AC') // '¬'
于 2014-11-26T05:39:35.453 回答