decodeURI()
和 decodeURIComponent()
是JavaScript中用于解码URI和URL编码字符串的方法。然而,当传入的URI或URL编码字符串不符合规范时,这些方法可能会抛出 "malformed uri exception" 异常。
URI规范
URI(Uniform Resource Identifier)是一种用来标识某个资源的字符串。它由多个部分组成,包括协议、主机名、端口号、路径、查询参数和哈希值等。例如:
https://www.example.com/path/to/resource?query=string#hash
URI 中的非 ASCII 字符和特殊字符需要经过编码才能正确传输和处理。常见的编码方式有:
- URL 编码:使用
%
符号加上两个十六进制数表示一个字符。例如,空格编码为%20
。 - Base64 编码:将二进制数据转换为可打印的 ASCII 字符。例如,字符串
"hello"
的 Base64 编码为"aGVsbG8="
。
decodeURI() 和 decodeURIComponent() 方法
decodeURI()
方法用于解码完整的 URI,而 decodeURIComponent()
方法用于解码单个 URI 组件(如查询参数)。这两个方法的用法分别如下:
decodeURI(encodedURI) decodeURIComponent(encodedURIComponent)
注意,如果传入的字符串不是 URI 或 URL 编码字符串,则这两个方法不会对其进行解码,并返回原始字符串。
malformed uri exception
当传入的 URI 或 URL 编码字符串不符合规范时,decodeURI()
和 decodeURIComponent()
方法会抛出 "malformed uri exception" 异常。例如:
decodeURI('%E0%A4%A') // Uncaught URIError: malformed URI sequence decodeURIComponent('%E0%A4%A') // Uncaught URIError: URI malformed
在上面的例子中,%E0%A4%A
是一个不完整的 UTF-8 字符编码,因此解码时会抛出异常。
解决方法
要避免 "malformed uri exception" 异常,可以先使用 encodeURI()
和 encodeURIComponent()
方法对字符串进行编码。这两个方法将确保生成的编码字符串符合规范。
const encodedURI = encodeURI('https://www.example.com/path/to/资源') console.log(encodedURI) // https://www.example.com/path/to/%E8%B5%84%E6%BA%90 const encodedQuery = encodeURIComponent('query=参数') console.log(encodedQuery) // query%3D%E5%8F%82%E6%95%B0
如果需要解码字符串,应该始终使用 try...catch
块捕获可能抛出的异常,以避免程序崩溃。
-- -------------------- ---- ------- --- ---------- --- - ---------- - --------------------- - ----- --- - ---------------- - --- ------------ --- - ------------ - -------------------------------- - ----- --- - ---------------- -
案例分析
考虑以下示例,在 URL 中包含了特殊字符 #
:
const url = 'http://www.example.com/path.html#foo=1'
如果直接对这个字符串调用 decodeURIComponent()
方法,会抛出 "malformed uri exception" 异常:
const decodedUrl = decodeURIComponent(url) // Uncaught URIError: URI malformed
因此,我们需要先提取出 URL 的哈希值部分,并对其进行解码:
-- -------------------- ---- ------- ----- --------- - ---------------- ----- ---- - -------------------- - -- --- ----------- --- - ----------- - ------------------------ - ----- --- - ---------------- -
这样就可以避免异常,并得到正确的解码结果。
总结
在 JavaScript 中,使用 decodeURI()
和 decodeURIComponent()
方法时需要注意传入的字符串是否符合 URI 或 URL 编码规范。如果存在非法字符或不完整的编码序
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/30174