历史背景

UTF‑8(8‑bit Unicode Transformation Format),1992年由Ken Thompson、Rob Pike设计,是Unicode的可变长编码方案。

  • 早期Unicode有UTF‑16,但是不兼容老式ASCII;
  • UTF‑8设计目标:完全兼容ASCII,同时可以表示全部Unicode码点,很快成为互联网事实标准。
  • 现在网页、JSON、Linux文件、绝大多数网络传输默认都是UTF‑8。

区分: Unicode:字符集(给字符分配码点U+xxxx) UTF‑8:编码方式(把码点转换成字节流)

核心规则

UTF‑8是可变长度编码,一个Unicode码点占用 1‑4 个字节

码点范围字节数二进制格式示例
U+0000 ~ U+007F1字节0xxxxxxxASCII字符(A、数字)
U+0080 ~ U+07FF2字节110xxxxx 10xxxxxx拉丁扩展、部分符号
U+0800 ~ U+FFFF3字节1110xxxx 10xxxxxx 10xxxxxx绝大多数汉字、日文韩文(BMP平面)
U+10000 ~ U+10FFFF4字节11110xxx 10xxxxxx 10xxxxxx 10xxxxxxemoji、生僻古汉字(辅助平面)

编码规则要点

  1. 首字节标记总字节数:
    • 0开头 → 1字节(ASCII)
    • 110开头 → 2字节
    • 1110开头 → 3字节
    • 11110开头 → 4字节
  2. 后续字节(续字节)固定以10开头,这是UTF‑8的校验标志。
  3. 最大支持到 U+10FFFF,完整覆盖全部Unicode码点。

例子

  • 字符 A,码点U+0041 → UTF‑8:0x41(1字节)
  • 汉字,码点U+4E2D → UTF‑8:0xE4 0xB8 0xAD(3字节)
  • 😀笑脸,码点U+1F600 → UTF‑8:0xF0 0x9F 0x98 0x80(4字节)

优缺点

✅优点

  1. 向下完全兼容ASCII:ASCII文件直接就是合法UTF‑8,不用转换。
  2. 网络传输友好,没有大小端问题(不像UTF‑16需要BOM标记)。
  3. 英文文本体积小;中文文本3字节。

❌缺点

  1. 汉字占用3字节,比UTF‑16的2字节更大;
  2. 可变长,不能直接按字节下标取第N个字符,必须解析字节流。

BOM 说明

UTF‑8不推荐使用BOM(字节顺序标记 0xEFBBBF

  • 部分Windows软件会自动给UTF‑8文件加上BOM;
  • 但网页、JSON、Linux环境一般禁止BOM,带BOM会造成解析异常。

对比简要

  • UTF‑8:可变长,互联网首选,无大小端;
  • UTF‑16:Windows/Java内部,BMP字符2字节;
  • UTF‑32:固定4字节,极少用于存储。

一句话总结

UTF‑8就是把Unicode码点,转换成1‑4字节的二进制字节流,兼容ASCII,是现在全世界互联网最通用的编码。