计算机底层只认二进制。把「文字」变成字节序列的规则,就是字符编码。 编码不一致或解码错误时,用户会看到「乱码」——本质是同一串字节被用错了字符集来解释。 UTF-8 是 Unicode 的一种变长编码,已成为 Web 与现代系统的主流。
入门:Unicode 与编码的区别
- Unicode:给字符分配码点(code point),例如 U+4E2D。
- UTF-8:把码点编码成 1~4 字节序列的规则;与 Latin-1、GBK 等完全不同。
入门:UTF-8 的基本性质
- 兼容 ASCII:ASCII 字符仍占 1 字节。
- 变长:中文常见 3 字节(基本多文种平面)。
- 自同步能力:多数情况下误切字节也会局部出错而非无限蔓延(仍非「随便截断都安全」)。
深入:乱码是怎么来的
- 文本实际是 UTF-8,却被声明或推断为 Latin-1/GBK。
- 二次编码:把已是 UTF-8 的字节再次当作「国标字符串」去转码。
- 传输链某一跳私自改了编码声明(HTTP 头、数据库连接字符集、串口波特率无关但同理:两端假设必须一致)。
实践清单
- HTTP:检查
Content-Type是否含charset=utf-8。 - 数据库:连接串与库/表排序规则一致。
- 源码:编辑器保存为 UTF-8;避免 BOM 引起的冷门兼容问题(按团队规范)。
- 嵌入式串口日志:终端编码与固件输出约定对齐。
Unicode Normalization(NFC/NFD)在比对文件名、用户名时也可能坑人;安全场景还需考虑 homoglyph 钓鱼——超出入门范围,遇到时再查 UTS #39 等资料。