Skip to content

Global

[TOC]

索引

字符编码

  • encodeURI()(uri)替代 escape(),用于对完整 URI进行编码的函数,遵循 UTF-8 编码标准,保留 URI 的合法字符(如协议、域名、路径中的 / 等)。
  • decodeURI()(encodedURI)替代 unescape(),用于解码通过 encodeURI() 编码的 URI的函数。保留 URI 的结构(如路径分隔符 /、查询符 ? 等),并支持 UTF-8 编码的字符解码。
  • encodeURIComponent()(str)替代 escape(),用于对 URI 组成部分(如查询参数、哈希值等)进行编码的函数。遵循 UTF-8 编码标准,会对更多字符(如 /, ?, = 等)进行编码,适合处理 URL 的局部内容。
  • decodeURIComponent()(encodedURI)替代 unescape(),用于解码由 encodeURIComponent() 编码的字符串的函数。它专门处理 URI 组成部分(如查询参数、哈希值等),将转义序列还原为原始字符,支持 UTF-8 编码标准。
  • escape()(str)已废弃,用于将字符串编码成新的由十六进制转义序列替换的字符串。
  • unescape()(str)已废弃,用于解码通过 escape() 编码的字符串的旧方法。

Global

字符编码

encodeURI()

encodeURI()(uri)替代 escape(),用于对完整 URI进行编码的函数,遵循 UTF-8 编码标准,保留 URI 的合法字符(如协议、域名、路径中的 / 等)。

  • uristring,要编码的完整 URI 字符串。可以是绝对 URL 或相对 URL。

  • 返回:

  • encodedURIstring,返回一个新的字符串,其中非法字符被替换为 UTF-8 编码的十六进制转义序列。

语法特性

  1. 不会被编码的字符

    text
    A-Z a-z 0-9                        // 字母和数字
    - _ . ! ~ * ' ( )                  // 特殊符号
    ; / ? : @ & = + $ , #              // URI 保留字符(encodeURIComponent中会被编码)
  2. 会被编码的字符

    • 空格%20
    • 非 ASCII 字符(如中文、Emoji)→ 多字节 UTF-8 编码(如 %E4%B8%AD
    • 其他非法字符(如 "{})→ 对应的 %XX%XX%XX... 形式。
  3. 对比 encodeURIComponent()

    • encodeURI():保留 URI 的合法分隔符(如 /, ?, =, &, #),适合编码完整 URI
    • encodeURIComponent():编码更多字符(包括 /, ?, =, & 等),适合编码URI 的组成部分(如查询参数值)。
    js
    encodeURI("/path?name=John")     // 返回 "/path?name=John"(保留 `/` 和 `?`)
    encodeURIComponent("/path?name=John") // 返回 "%2Fpath%3Fname%3DJohn"

示例

  1. 基本编码

    js
    // 测试路径  ->  %E6%B5%8B%E8%AF%95%E8%B7%AF%E5%BE%84
    // 张三     ->  %E5%BC%A0%E4%B8%89
    // : / ?   ->  被保留
    encodeURI("https://example.com/测试路径?name=张三&age=20") 
    // 返回 "https://example.com/%E6%B5%8B%E8%AF%95%E8%B7%AF%E5%BE%84?name=%E5%BC%A0%E4%B8%89&age=20"

decodeURI()

decodeURI()(encodedURI)替代 unescape(),用于解码通过 encodeURI() 编码的 URI的函数。保留 URI 的结构(如路径分隔符 /、查询符 ? 等),并支持 UTF-8 编码的字符解码。

  • encodedURIstring,一个已编码的完整 URI 字符串(通常由 encodeURI() 生成)。

  • 返回:

  • uristring|URIError

    • 解码成功:返回一个解码后的新字符串,将 encodeURI() 生成的转义序列还原为原始字符。
    • 错误处理:包含无效的转义序列(如 %XXXX 非十六进制数,或 % 后不足两位字符),会抛出 URIError

语法特性

  1. 解码规则

    • UTF-8 转义序列(如 %E4%B8%AD)→ 解码为对应 Unicode 字符(如 )。
    • 保留字符(如 /, ?, =, &, #)→ 保持原样,不进行解码。
    • 非法转义序列(如不完整的 %XX 或无效的 UTF-8 编码)→ 抛出 URIError
  2. 对比 decodeURIComponent()

    • decodeURI():仅解码由 encodeURI() 编码的字符,保留 URI 保留字符(如 /, ?, =)。
    • decodeURIComponent():解码由 encodeURIComponent() 编码的字符串,包括 URI 保留字符(如 /%2F)。
    js
    decodeURI("%2F")        // 返回 "%2F"(不处理 `/` 的编码)
    decodeURIComponent("%2F") // 返回 "/"(解码 `/`)
  3. 编码一致性:始终与 encodeURI() 配对使用,避免与 encodeURIComponent() 混用。

示例

  1. 基本解码

    • 路径 /path、查询符 ?、哈希符 # 未被解码。
    • %E5%BC%A0%E4%B8%89会被解码成张三
    js
    decodeURI("https://example.com/path?name=%E5%BC%A0%E4%B8%89&age=20#section") 
    // 返回 "https://example.com/path?name=张三&age=20#section"

encodeURIComponent()

encodeURIComponent()(str)替代 escape(),用于对 URI 组成部分(如查询参数、哈希值等)进行编码的函数。遵循 UTF-8 编码标准,会对更多字符(如 /, ?, = 等)进行编码,适合处理 URL 的局部内容。

  • strstring,需要编码的字符串(通常作为 URI 的一部分,如查询参数值)。

  • 返回:

  • encodedURIstring,返回一个新的字符串,其中非法字符被替换为 UTF-8 编码的十六进制转义序列。

语法特性

  1. 不会被编码的字符

    text
    A-Z a-z 0-9                       // 字母和数字
    - _ . ! ~ * ' ( )                 // 特殊符号
  2. 会被编码的字符

    • 空格%20(而非 +)。
    • 非 ASCII 字符(如中文、Emoji)→ 多字节 UTF-8 编码(如 %E4%B8%AD)。
    • 其他非法字符(如 {, }, ")→ 对应的 %XX%XX%XX... 形式。
    • URI 保留字符(如 /, ?, =, &, # 等)→ 转为 %XX 形式(encodeURI 中不会被编码)。
  3. 对比 encodeURI:见 encodeURI()

  4. 处理 + 和空格

    • encodeURIComponent() 将空格编码为 %20,而表单提交(application/x-www-form-urlencoded)中空格可能转为 +

    • 若需兼容表单格式,可手动替换:

      js
      encodeURIComponent("a b").replace(/%20/g, "+") // 返回 "a+b"

示例

  1. 编码查询参数:

    js
    encodeURIComponent("name=张三&age=20") 
    // 返回 "name%3D%E5%BC%A0%E4%B8%89%26age%3D20"
    // = → %3D,& → %26,张 → %E5%BC%A0
  2. 处理特殊符号

    js
    encodeURIComponent("Hello World! 😊") 
    // 返回 "Hello%20World%21%20%F0%9F%98%8A"
    // 空格 → %20,! → %21,😊 → %F0%9F%98%8A
  3. 编码路径片段

    js
    encodeURIComponent("/path/to/file") 
    // 返回 "%2Fpath%2Fto%2Ffile"
    // / → %2F

decodeURIComponent()

decodeURIComponent()(encodedURI)替代 unescape(),用于解码由 encodeURIComponent() 编码的字符串的函数。它专门处理 URI 组成部分(如查询参数、哈希值等),将转义序列还原为原始字符,支持 UTF-8 编码标准。

  • encodedURIstring,一个已编码的字符串(通常由 encodeURIComponent() 生成)。
  • 返回:
  • urisring|URIError
    • 成功解码:返回一个解码后的新字符串,将所有有效的转义序列还原为原始字符。
    • 错误处理:包含无效的转义序列(如 %XXXX 非十六进制数,或 % 后不足两位字符),会抛出 URIError

语法特性

  1. 解码规则

    • 转义序列解码
      • 单字节字符%XXXX 为两位十六进制数)→ 解码为对应的 ASCII 字符。
      • 多字节 UTF-8 字符%XX%YY%ZZ... → 合并为 UTF-8 编码的 Unicode 字符。
    • 保留字符解码:URI 保留字符(如 /, ?, =)的编码会被还原。
  2. 编码一致性:始终与 encodeURIComponent() 配对使用,避免与 encodeURI() 混用。

  3. 错误处理:使用 try...catch 处理可能抛出的 URIError,尤其是在处理用户输入或外部数据时。

    js
    try {
      decodeURIComponent("%GG"); // 无效的十六进制(GG 非合法)
    } catch (e) {
      console.error(e); // 抛出 URIError: URI malformed
    }
  4. 处理 + 和空格

    • 表单提交(application/x-www-form-urlencoded)会将空格转为 +,而 encodeURIComponent() 转为 %20
    • 若需兼容,可手动替换:
    js
    const encoded = encodeURIComponent("a b").replace(/%20/g, "+"); // "a+b"
    const decoded = decodeURIComponent(encoded.replace(/+/g, "%20")); // 还原为 "a b"

示例

  1. 解码查询参数

    js
    decodeURIComponent("name%3D%E5%BC%A0%E4%B8%89%26age%3D20") // 返回 "name=张三&age=20"
    // %3D → =,%E5%BC%A0 → 张,%26 → &
  2. 处理特殊符号

    js
    decodeURIComponent("%24%23%25") // 返回 "$#%"
    // %24 → $,%23 → #,%25 → %
  3. 解码 Unicode 字符

    js
    decodeURIComponent("%F0%9F%98%8A") // 返回 "😊"
    // %F0%9F%98%8A -> 😊

escape()

escape()(str)已废弃,用于将字符串编码成新的由十六进制转义序列替换的字符串。

  • strstring,要编码的字符串。

  • 返回:

  • strstring,返回一个新的字符串,其中某些字符被替换为十六进制转义序列。具体规则如下:

    • 不转义的字符:ASCII 字母(A-Z a-z)、数字(0-9)、以及特殊符号 @*_+-./
    • 转义的字符
      • 其他字符会被替换为 %XXXX 是字符的十六进制码点,适用于码点小于 0xFF 的字符)。
      • Unicode 字符(码点 ≥ 0xFF)会被替换为 %uXXXX(UTF-16 编码的码元)。

语法特性

  1. 废弃原因:对 Unicode 字符处理不符合现代标准(如 UTF-8)。
  2. 替代方案

示例

  1. 基本字符

    js
    escape('abc123@*-_+./') // 返回 "abc123@*-_+./"
  2. 空格和符号

    js
    escape('Hello World!') // 返回 "Hello%20World%21"
  3. Latin-1 字符

    js
    escape('é') // 返回 "%E9"(假设字符编码为 Latin-1)
  4. Unicode 字符

    js
    escape('α') // 返回 "%u03B1"(Unicode 码点 U+03B1)
    escape('😊') // 返回 "%uD83D%uDE0A"(UTF-16 代理对)

unescape()

unescape()(str)已废弃,用于解码通过 escape() 编码的字符串的旧方法。

  • strstring,需要解码的字符串(通常由 escape() 编码生成)。

  • 返回:

  • strstring,返回一个解码后的新字符串,将 escape() 生成的转义序列还原为原始字符。

语法特性

  1. 解码规则

    • %XXXX 为两位十六进制数)→ 解码为 Latin-1 字符(码点 0x000xFF)。
    • %uXXXXXXXX 为四位十六进制数)→ 解码为 Unicode 字符(UTF-16 码元)。
    • 其他字符(如字母、数字、保留符号)→ 保持不变。
  2. 废弃原因

    • 不支持 UTF-8 编码(仅支持 Latin-1 和 UTF-16)。
    • 无法正确处理 URL 编码(如 + 解码为空格、保留字符处理不一致)。
  3. 替代方案

示例

  1. 简单解码

    js
    unescape("Hello%20World%21")      // 返回 "Hello World!"
    unescape("%E9")                  // 返回 "é"(Latin-1 字符)
    unescape("%u03B1")               // 返回 "α"(Unicode 字符)
  2. 混合编码字符

    js
    unescape("Name%3A%20%u5F20%u4E09") // 返回 "Name: 张三"
    • %3A:
    • %20 → 空格
    • %u5F20
    • %u4E09
  3. 无法处理 UTF-8 编码

    js
    unescape("%F0%9F%98%8A")         // 返回 "😊"(错误解码,应为 "😊")
    • %F0%9F%98%8A😊 的 UTF-8 编码,但 unescape() 按字节解码,导致乱码。