DecodeURIComponent 不支持 %uXXXX 编码的组件



DecodeURIComponent 不支持很少的编码组件

我正在向 JD 发送带有公告格式的 json , 在 restapi 中.所以我正在编码 jd 并发送。这工作正常,没有任何问题。但是当我尝试解码编码的JD时,我收到错误,因为URI格式不正确

var jd = "Where are bullets most often used?
- Technical writing
- Reference works
- Notes
- Presentations";

var json ={
"job":encodeURIComponent(escape(jd));
}

译码:

var jd = decodeURIComponent(jd);

这是我从响应中获得的编码 jd。

Where%20are%20bullets%20most%20often%20used%3F%0A%uF0B7Technical%20writing%0A%uF0B7Sub%20bullet%0A%uF0B7Reference%20works%0A%uF0B7Notes%0A%uF0B7Presentations%0A%uF0B7Lists%0AAn%20alternative%20method%20is%20to%20use%20a%u807Dnumbered%20list%3A%0A1.Technical%20writing%0A2.Reference%20works%0A3.Notes%0A4.Presentations%0A5.Lists

你必须先unescape

var jd = decodeURIComponent(unescape(json.job));

避免使用escape()

从文档中:

转义((

escape()函数计算一个新字符串,其中某些字符已替换为十六进制转义序列。

描述

转义函数是全局对象的属性。对特殊字符进行编码,但以下字符除外:@*_+-./

代码单元值为0xFF或更小的字符的十六进制形式是两位数转义序列:%xx。对于具有较大代码单元的字符,使用四位数格式%uxxxx

荒废的。不适用于新网站。

— MDN JavaScript 参考 - escape((

来自维基百科:

Unicode 字符存在一种非标准编码:%uxxxx,其中xxxx是一个 UTF-16 代码单元,表示为四个十六进制数字。此行为未由任何 RFC 指定,并且已被 W3C 拒绝。ECMA-262 的第三版仍然包括使用此语法的escape函数,以及将 UTF-8 编码应用于字符串,然后对生成的字节进行百分encodeURIencodeURIComponent函数。

— 维基百科 - 百分比编码 - 非标准实现

最新更新