JavaScript中的URL编码:如何处理和转义非ASCII字符

星期五, 1月 3, 2025 | 1分钟阅读 | 更新于 星期五, 1月 3, 2025

@
JavaScript中的URL编码:如何处理和转义非ASCII字符

1. 字符的码点

首先,字符 "中" 是一个汉字,其Unicode码点为 U+4E2D。在十六进制中,U+4E2D 对应的数字是 0x4E2D。Unicode是字符集的标准,每个字符都对应一个唯一的码点。

2. 编码的规则

UTF-8是一种可变长度的字符编码方案,采用1到4个字节来表示字符。对于字符 "中",其Unicode码点 U+4E2D 落在 0x08000xFFFF 的范围内,因此它将使用3个字节来进行编码。

UTF-8编码规则简述:

  • 1字节编码 :适用于Unicode范围从 0x00000x007F(即ASCII字符),用一个字节表示,格式为:0xxxxxxx
  • 2字节编码 :适用于Unicode范围从 0x00800x07FF,用两个字节表示,格式为:110xxxxx 10xxxxxx
  • 3字节编码 :适用于Unicode范围从 0x08000xFFFF,用三个字节表示,格式为:1110xxxx 10xxxxxx 10xxxxxx
  • 4字节编码 :适用于Unicode范围从 0x100000x10FFFF,用四个字节表示,格式为:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

3. 字符 "中" 的UTF-8编码过程

对于字符 "中",其Unicode码点为 U+4E2D,因此我们需要按照UTF-8的3字节编码规则进行编码。

  1. 获取Unicode码点

    • "中" 的Unicode码点是 U+4E2D,十六进制值为 0x4E2D
  2. 转换为二进制

    • 0x4E2D 转换为二进制: 0x4E2D = 0100 1110 0010 1101(16位二进制表示)
  3. 按照UTF-8编码格式进行编码

    • 根据UTF-8的规则,U+4E2D 需要用三个字节来表示。
    • UTF-8的3字节格式是: 1110xxxx 10xxxxxx 10xxxxxx
    • 将二进制数 0100111000101101 填入到上述格式中:
      • 第一个字节1110xxxx):将 0100111 放入 xxxx 部分,得到 11100100
      • 第二个字节10xxxxxx):将 001011 放入 xxxxxx 部分,得到 10111000
      • 第三个字节10xxxxxx):将 101101 放入 xxxxxx 部分,得到 10101101

    这样,U+4E2D 的UTF-8编码就为:1110 0100 1011 1000 1010 1101

  4. 转换为十六进制

    • 将每个字节转换为十六进制表示:
      • 11100100E4
      • 10111000B8
      • 10101101AD

    所以,字符 "中" 的UTF-8编码是:E4 B8 AD

4. 转换为URL百分号编码

在URL编码中,所有非ASCII字符(包括UTF-8编码的字符)都需要转换成百分号编码格式,即将每个字节转换为 % 后跟上该字节的十六进制值。因此,UTF-8编码的 E4 B8 AD 将被转换为URL编码格式:

  • E4%E4
  • B8%B8
  • AD%AD

最终,字符 "中" 的URL编码就是:%E4%B8%AD

5. 总结过程

总结一下字符 "中" 从Unicode到UTF-8编码,再到URL百分号编码的完整过程:

  1. 获取字符的Unicode码点:U+4E2D
  2. 将Unicode码点 U+4E2D 转换为二进制:0100111000101101
  3. 根据UTF-8编码规则,将二进制值转换为3字节:E4 B8 AD
  4. 将每个字节转换为URL百分号编码:%E4%B8%AD

6. JS代码示例

JavaScript提供了两个主要函数来进行URL编码:

  • encodeURIComponent():编码单个URL组件(如查询参数、路径段等)。
  • encodeURI():编码整个URL,但不会编码已是URL合法的字符,如冒号(:)、斜杠(/)等。
const str = '中';
const encodedStr = encodeURIComponent(str);
console.log(encodedStr); // 输出: %E4%B8%AD

结论

通过以上详细过程,我们可以看出UTF-8编码采用变长字节表示方式,字符 "中" 使用了3个字节进行编码。而URL编码则将这些字节转换为百分号表示,从而保证了字符可以在网络中正确传输并被解析。希望这个过程帮助您更好地理解UTF-8编码和URL编码的实现原理。

© 2016 - 2025 Jebben 开发日志&网络随笔

🌱 Powered by Hugo with theme Dream.

关于博主

自我介绍

大家好,我是 Jabin,一名拥有 8 年工作经验的前端工程师。我是一个自学成才的开发者,通过不断学习和实践,积累了丰富的 web 端开发经验以及在 B 端后台管理、监控和 C 端教育、媒体类项目方面的丰富经验。

关于我的技能

我精通多种前端技术,包括但不限于:

  • JavaScript 和 TypeScript:我熟练掌握 JavaScript 和 TypeScript,能够利用它们构建出色的前端应用程序。
  • CSS:我对 CSS 有深入的理解,能够编写出美观、响应式的样式。
  • 前端框架:我熟练使用 Angular、React、Vue 和 Next.js 等前端框架,能够根据项目需求灵活选择并应用合适的技术栈。
  • 前端工具:我熟悉 webpack、Vite 等常用的前端打包工具,以及框架配套的 CLI 工具,能够高效地进行项目开发和部署。
  • 后端技术:我了解服务端语言 Java 和 Node.js,并能够与后端开发人员紧密合作,实现完整的应用程序。
  • 数据库和操作系统:我熟悉 SQL 数据库和 Linux 操作系统的常见操作和命令,能够进行数据库管理和服务器配置。

我的项目经验

我曾主导多个从零到一的项目,参与过数百万 UV 项目的开发,具有丰富的项目开发与团队合作经验。

我对技术充满热情,喜欢钻研新技术和解决复杂的技术问题。我还积极参与开源社区,贡献自己的力量,与各地的开发者共同探索和分享技术前沿。

结语

我是一个对技术认真负责、可靠可靠的人,热爱挑战和创新。我希望通过我的个人网站,与更多志同道合的人分享我的经验和见解,共同推动前端技术的发展和进步。

欢迎来到我的个人网站,期待与您的交流和合作!