计算机底层只认二进制。把「文字」变成字节序列的规则,就是字符编码。 编码不一致或解码错误时,用户会看到「乱码」——本质是同一串字节被用错了字符集来解释UTF-8 是 Unicode 的一种变长编码,已成为 Web 与现代系统的主流。

入门:Unicode 与编码的区别

  • Unicode:给字符分配码点(code point),例如 U+4E2D。
  • UTF-8:把码点编码成 1~4 字节序列的规则;与 Latin-1、GBK 等完全不同

入门:UTF-8 的基本性质

  • 兼容 ASCII:ASCII 字符仍占 1 字节。
  • 变长:中文常见 3 字节(基本多文种平面)。
  • 自同步能力:多数情况下误切字节也会局部出错而非无限蔓延(仍非「随便截断都安全」)。

深入:乱码是怎么来的

  1. 文本实际是 UTF-8,却被声明或推断为 Latin-1/GBK。
  2. 二次编码:把已是 UTF-8 的字节再次当作「国标字符串」去转码。
  3. 传输链某一跳私自改了编码声明(HTTP 头、数据库连接字符集、串口波特率无关但同理:两端假设必须一致)。

实践清单

  • HTTP:检查 Content-Type 是否含 charset=utf-8
  • 数据库:连接串与库/表排序规则一致。
  • 源码:编辑器保存为 UTF-8;避免 BOM 引起的冷门兼容问题(按团队规范)。
  • 嵌入式串口日志:终端编码与固件输出约定对齐。

Unicode Normalization(NFC/NFD)在比对文件名、用户名时也可能坑人;安全场景还需考虑 homoglyph 钓鱼——超出入门范围,遇到时再查 UTS #39 等资料。

与其它主题的衔接

JSON 文本、REST API 响应体与日志系统均依赖一致编码。