跳转至

常见的字符编码有哪些?有什么区别?

面试回答

面试官: 常见的字符编码有哪些?有什么区别?

你:

字符编码本质上就是“怎么把文字存成二进制,再怎么从二进制读出文字”的规则。搞不清编码,乱码天天有。最常见的就这四个:

  1. ASCII

最早最基础,用 1 个字节存一个字符,但只用低 7 位,能表示 128 个符号。只有英文字母、数字、标点,没有汉字。所以它是所有编码的公共子集,UTF-8 里英文部分完全就是 ASCII,天然兼容。

  1. 中文编码 GB2312 / GBK / GB18030

中国自己搞的。GB2312 收了常用简体和符号,用 1~2 个字节表示;GBK 扩展了繁体等更多字符,也是 1~2 字节;GB18030 进一步支持少数民族文字和更大字符集,可用 1、2、4 个字节。它们的共同特点是:向下兼容 ASCII,但互相之间可能不兼容。你用 GBK 写,用 GB2312 打开,生僻字可能就变乱码了。

  1. Unicode

只为世界所有字符分配一个唯一编号(码点),但不规定怎么存储。比如“汉”字编号是 U+6C49。Unicode 是“字符集”,不是具体的存储方式。

  1. UTF-8 和 UTF-16

它们才是真正实现 Unicode 的“编码方案”。

  • UTF-8:可变长度,1~4 个字节。ASCII 字符用 1 字节,中文用 3 字节,一些 emoji 用 4 字节。没有字节序问题,对网络传输极友好,是目前互联网使用最广的编码。

  • UTF-16:以 2 字节为单位,一个字符用 2 或 4 字节。Java 内部字符串就用 UTF-16 存储,所以一个 char 并不等于一个字符(辅助字符需要两个 char 表示)。UTF-16 有字节序问题,需要 BOM 标记。

核心区别一句话: ASCII 是最小的交集,中文编码按地区扩展,Unicode 统一编号,UTF-8/16 负责把编号塞进字节里,一个省流量,一个处理快。

deepseek_mermaid_20260612_e16a41.png