编程中用到的字符编码知识点

💡 原文中文,约8200字,阅读约需20分钟。
📝

内容提要

字符集是一组字符的集合,字符编码是字符集的具体编码规则。ASCII字符集是计算机使用的基本字符集,包含128个字符。Unicode字符集是国际组织制定的字符集方案,可以收纳世界上所有文字和符号。UTF-8是一种可变长度的字符编码方式,常用于前端开发。UTF-16是定长的编码方式,每个字符占2或4个字节。

🔎

延伸解读

为什么前端开发中容易遇到乱码

文章指出,JavaScript 源码通常基于 UTF-8 编码,但字符串类型实际采用 UTF-16 编码。而许多后端服务使用 UTF-8 编码,前后端编码方式不一致,就可能导致接口返回的字符串出现乱码。理解这一点,有助于在联调时快速定位编码问题,而不是盲目排查其他环节。

UTF-8 与 UTF-16 的编码差异

UTF-8 是可变长度编码,使用 1 到 4 个字节,汉字一般占 3 字节,表情符号占 4 字节。UTF-16 则是 2 或 4 字节,基本平面字符占 2 字节,辅助平面字符占 4 字节。文章通过字母、汉字和表情的对比,直观展示了两者在字节数和码元上的不同,帮助读者根据场景选择合适的编码方式。

字符串长度计算中的陷阱

JavaScript 字符串的 length 属性基于 UTF-16 码元个数。多数汉字和 ASCII 字符只占一个码元,length 为 1;但表情符号等辅助平面字符占两个码元,length 为 2。组合字符如 é 也可能 length 为 2。文章提醒,直接使用 length 或下标操作多码元字符会得到错误结果,需借助扩展运算符、Array.from 或 normalize() 等方法处理。

处理 Unicode 的常用 API 与注意事项

文章列举了 charAt、charCodeAt、codePointAt、String.fromCharCode、String.fromCodePoint 等 API 的区别,并指出 ES6 的 u 修饰符能正确处理大于 U+FFFF 的字符,但对组合字符无效。TextEncoder/TextDecoder 可用于 UTF-8 编解码,normalize() 能统一字符的不同表示。URL 编解码方面,encodeURIComponent 会编码 URL 元字符,而 encodeURI 不会,使用时需根据场景选择。

❓

Q&A

什么是字符集和字符编码?

字符集是字符的集合,字符编码是字符集的具体编码规则,用于在计算机中解析字符。

ASCII字符集包含多少个字符?

ASCII字符集包含128个字符,主要用于英文显示。

Unicode字符集的特点是什么?

Unicode字符集可以收纳世界上所有文字和符号,最多可有1114112个字符。

UTF-8和UTF-16的主要区别是什么?

UTF-8是可变长度编码,使用1到4个字节;而UTF-16是定长编码,基本字符占用2个字节,辅助字符占用4个字节。

JavaScript中字符串的编码方式是什么?

JavaScript中的字符串类型采用UTF-16编码,而源码文本通常基于UTF-8编码。

如何处理Unicode中的组合字符?

处理组合字符时,可以使用normalize()方法来统一不同表示的字符形式。

🏷️

标签

➡️

继续阅读