| 项目 | 值 |
|---|
为什么需要查字符的编码信息
日常开发中有一类问题反复出现:网页显示成问号或方块、正则表达式匹配不到中文、文件在不同系统间打开变成乱码、数据库字段长度不够导致截断。这些问题的根源都指向同一个东西——字符在底层的字节表示。知道一个字符占几个字节、码点是多少,排查效率会高很多。
三套编码要分清
- Unicode 码点是字符的抽象编号,例如汉字「中」是 U+4E2D。它是一个逻辑概念,与存储无关。
- UTF-8是变长编码,一个码点占 1 到 4 个字节,兼容 ASCII,是互联网与文件系统的主流。汉字通常占 3 字节。
- UTF-16是 JavaScript 与 Windows 内部使用的编码,基本平面字符占 2 字节,辅助平面字符(如 Emoji)需要两个单元共 4 字节。
最容易混淆的是 UTF-16 的「代理对」:像 😀 这样的 Emoji,码点是 U+1F600,超出 0xFFFF,在 JavaScript 里它的 length 是 2 而不是 1。这就是为什么「判断字符串长度」在含 Emoji 的文本上会出错,也是很多截断逻辑把 Emoji 切成乱码的原因。
HTML 实体与转义
HTML 实体(如 中)用来在网页中安全地表示特殊字符,避免与标签语法冲突。JS 转义序列(如 \u4E2D; 去掉分号后的形式)则用于在代码字符串里写入任意字符。两者都以码点为基准,查到这个数字就能写出任意一种形式。
常见问题
为什么汉字在不同编码下字节数不同
GBK 编码下一个汉字固定占 2 字节,而 UTF-8 下通常占 3 字节。「中」在 GBK 是 D6 D0,在 UTF-8 是 E4 B8 AD。这正是乱码的来源:用 GBK 存的字节流按 UTF-8 解读,就会显示成三个无意义的符号。解决办法是明确声明编码,不要依赖浏览器猜测。
Emoji 为什么会占 4 个字节
因为 Emoji 大多位于 Unicode 的辅助平面(码点大于 0xFFFF),超出 UTF-8 三字节能表示的范围(上限 0xFFFF),因此需要 4 字节的编码形式。还有一些 Emoji 由多个码点组合而成(例如带肤色的手势、家庭组合),实际字节数会更多,字符串长度也会达到 4 到 8。
你可能还想问
能查到哪些信息?
常见有编码值、所属区块、字符类别与十六进制表示;这些信息在排查乱码、字体缺失与转义问题时非常实用。
为什么同一字符显示不一样?
不同字体对同一码位的字形设计不同,或系统做了字体回退替换;字符本身没变,只是显示字形不同。
查不到某个字符怎么办?
可能是输入法打出的并非目标码位,或该字符来自特殊符号区未被收录;换个来源复制或直接按码位检索即可。
速查在线工具箱