Javascript decodeURI(Component) malformed uri exception

阅读时长 4 分钟读完

decodeURI()decodeURIComponent() 是JavaScript中用于解码URI和URL编码字符串的方法。然而,当传入的URI或URL编码字符串不符合规范时,这些方法可能会抛出 "malformed uri exception" 异常。

URI规范

URI(Uniform Resource Identifier)是一种用来标识某个资源的字符串。它由多个部分组成,包括协议、主机名、端口号、路径、查询参数和哈希值等。例如:

URI 中的非 ASCII 字符和特殊字符需要经过编码才能正确传输和处理。常见的编码方式有:

  • URL 编码:使用 % 符号加上两个十六进制数表示一个字符。例如,空格编码为 %20
  • Base64 编码:将二进制数据转换为可打印的 ASCII 字符。例如,字符串 "hello" 的 Base64 编码为 "aGVsbG8="

decodeURI() 和 decodeURIComponent() 方法

decodeURI() 方法用于解码完整的 URI,而 decodeURIComponent() 方法用于解码单个 URI 组件(如查询参数)。这两个方法的用法分别如下:

注意,如果传入的字符串不是 URI 或 URL 编码字符串,则这两个方法不会对其进行解码,并返回原始字符串。

malformed uri exception

当传入的 URI 或 URL 编码字符串不符合规范时,decodeURI()decodeURIComponent() 方法会抛出 "malformed uri exception" 异常。例如:

在上面的例子中,%E0%A4%A 是一个不完整的 UTF-8 字符编码,因此解码时会抛出异常。

解决方法

要避免 "malformed uri exception" 异常,可以先使用 encodeURI()encodeURIComponent() 方法对字符串进行编码。这两个方法将确保生成的编码字符串符合规范。

如果需要解码字符串,应该始终使用 try...catch 块捕获可能抛出的异常,以避免程序崩溃。

-- -------------------- ---- -------
--- ----------
--- -
  ---------- - ---------------------
- ----- --- -
  ----------------
-

--- ------------
--- -
  ------------ - --------------------------------
- ----- --- -
  ----------------
-

案例分析

考虑以下示例,在 URL 中包含了特殊字符 #

如果直接对这个字符串调用 decodeURIComponent() 方法,会抛出 "malformed uri exception" 异常:

因此,我们需要先提取出 URL 的哈希值部分,并对其进行解码:

-- -------------------- ---- -------
----- --------- - ----------------
----- ---- - -------------------- - --

--- -----------
--- -
  ----------- - ------------------------
- ----- --- -
  ----------------
-

这样就可以避免异常,并得到正确的解码结果。

总结

在 JavaScript 中,使用 decodeURI()decodeURIComponent() 方法时需要注意传入的字符串是否符合 URI 或 URL 编码规范。如果存在非法字符或不完整的编码序

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/30174

纠错
反馈