有用

代码与技术常识08 / 10

UTF-8 编码规则

一个汉字通常占 3 个字节,英文字母占 1 个。

  • 学会用时1 小时
  • 你的收获乱码、字数、截断问题自己能定位
  • 用到的频率每周 1 次
  • 难度进阶

01为什么学

没学之前

中文出现乱码,截断后多出半个字,字数统计总是差很多。

学会之后

看懂字节开头的几位,知道一个字符占几个字节。

  • 乱码、字数、截断问题自己定位
  • 理解「一个汉字算几个 token」这类问题

02图解

图解
「中」 = U+4E2D = 0100 111000 101101 11100100 10111000 10101101 字节 1 = E4字节 2 = B8字节 3 = AD 深色是前缀位(标明是第几个字节),浅色是码点的真实数据位
「中」的码点拆成 4 + 6 + 6 位,装进 3 个字节,得到 E4 B8 AD。

03基本单元5 个

  • 1 字节0xxxxxxx
  • 2 字节110xxxxx 10xxxxxx
  • 3 字节1110xxxx 10xxxxxx 10xxxxxx
  • 4 字节11110xxx 开头
  • 码点U+4E2D

04怎么用

  1. 首字节以 0 开头1 字节(ASCII);110 开头:2 字节;1110 开头:3 字节;11110 开头:4 字节
  2. 后续字节一律以 10 开头
  3. 汉字多数是 3 个字节,emoji 多是 4 个字节
  4. 截断字节串时要停在字符边界,否则出现乱码

05速查表

字符范围字节数例子
英文、数字(ASCII)1A、1
拉丁扩展、希腊等2é、Ω
汉字、日文、韩文等3中、あ、한
emoji、罕见字4😀、𠮷

06动手试试

UTF-8 查看器

07套用一次

「你好」两个汉字 = 6 字节;按字节从中间截断,就会出现乱码「�」。

08常见的坑

  • 按字节截取中文

    按字符截取,或把截断位置退到字符边界。

  • 以为字符数等于字节数

    数据库字段长度、接口限制可能按字节算。

09自测与练习

先做 10 秒自测,再动手练一下。

一个常用汉字在 UTF-8 里一般占几个字节?

10 分钟小练习

在查看器里输入你的名字,数一下字节数。

看参考答案
中文名通常是 3 字节 × 字数。

+配合着学

代码与技术常识的全部 10 条