DecodeURIComponent不支持%uXXXX编码组件,解码JD时报URI格式错误
DecodeURIComponent不支持部分编码组件
我来帮你捋清楚这个问题的根源,以及怎么解决这个URI格式错误的问题。
问题出在哪?
你现在的代码里混用了escape()和encodeURIComponent(),这俩函数的编码规则完全不一样:
escape()会把非ASCII字符(包括中文、那个特殊项目符号)转成%uXXXX的Unicode转义格式encodeURIComponent()则是把字符转换成UTF-8字节序列,再编码成%XX%XX的标准URI编码格式
当你先escape再encodeURIComponent后,最终的字符串里会同时存在%uF0B7、%u807D这类escape生成的特殊转义,而decodeURIComponent()只认UTF-8风格的%XX编码,根本处理不了%u开头的格式,自然就会抛出"URI格式错误"的报错。
正确的编码方式
你完全不需要先用escape(),直接用encodeURIComponent()编码整个JD内容就行,这样编码后的内容能完美适配decodeURIComponent()的解码要求:
var jd = "Where are bullets most often used? - Technical writing - Reference works - Notes - Presentations"; var json = { "job": encodeURIComponent(jd) };
修复已有的错误编码字符串
如果已经有了像你提供的那种混合编码的字符串,也能补救——先把%uXXXX格式的转义转换成对应的UTF-8编码,再用decodeURIComponent()解码。可以用这个函数来处理:
function fixAndDecode(encodedStr) { // 把所有%uXXXX格式的转义替换成UTF-8编码格式 return decodeURIComponent(encodedStr.replace(/%u([0-9A-F]{4})/gi, function(match, hex) { var charCode = parseInt(hex, 16); return encodeURIComponent(String.fromCharCode(charCode)); })); } // 用法示例 var encodedJd = "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"; var decodedJd = fixAndDecode(encodedJd); console.log(decodedJd);
这个函数会先把所有%uXXXX的特殊转义转换成标准URI编码,之后decodeURIComponent()就能正常解码出原本的JD内容了。
内容的提问来源于stack exchange,提问作者Nicoleta Wilskon
相关产品推荐
相关产品推荐

