utf-8用1–4字节变长编码unicode码点,字节数由码点范围决定:u+0000–u+007f(如'a')占1字节(0xxxxxxx),u+0080–u+07ff(如'é')占2字节(110xxxxx 10xxxxxx),u+0800–u+ffff(如'你')占3字节(1110xxxx 10xxxxxx 10xxxxxx),u+10000–u+10ffff(如'?')占4字节(11110xxx 10xxxxxx 10xxxxxx 10xxxxxx),设计兼顾ascii兼容性与自同步性。

UTF-8 的变长规则怎么讲才准确
面试时讲 UTF-8,重点不是背定义,而是说清“为什么变长”和“怎么变”。一句话概括:UTF-8 用 1–4 个字节表示一个 Unicode 码点,字节数由码点大小决定,且每个字节的高位模式可唯一识别其在序列中的位置。
分情况说明字节结构(必须带例子)
直接按码点范围拆解,配合典型字符举例:
-
ASCII 字符(U+0000–U+007F):1 字节
首位为 0,后 7 位即 ASCII 值。例如 'A'(U+0041)→
01000001 -
拉丁扩展/西里尔/希腊字母(U+0080–U+07FF):2 字节
首字节以
110开头,次字节以10开头。例如 'é'(U+00E9)→11000011 10101001 -
常用汉字(U+0800–U+FFFF):3 字节
首字节以
1110开头,后两字节均以10开头。例如 '你'(U+4F60)→11100100 10111101 10100000 -
Emoji 和生僻字(U+10000–U+10FFFF):4 字节
首字节以
11110开头,后三字节均以10开头。例如 '?'(U+1F680)→11110000 10011111 10011010 10000000
强调两个关键设计意图
这能体现你理解背后的工程权衡:
- 向前兼容 ASCII:所有 ASCII 字符在 UTF-8 下仍是单字节、高位为 0,旧系统处理纯英文文本完全无感知
-
自同步性(self-synchronizing):任意字节流中,只要看到
0xxxxxxx就知是独立字符;看到11xxxxxx就知是多字节起始;看到10xxxxxx就知是续字节。即使从中间截断,也能快速定位下一个合法字符起点
顺带点破常见误区
避免被追问住:
- “UTF-8 中文一定占 3 字节?” → 不对。U+0800 以下的中文标点或扩展 A 区部分汉字(如‘〇’U+3007)是 2 字节;U+10000 以上的汉字(如‘?’U+20BB7)是 4 字节
- “Java 的 char 是 UTF-8 吗?” → 不是。Java 内部用 UTF-16 表示 String,char 是 16 位代码单元;UTF-8 只出现在 I/O 编码转换环节(如
String.getBytes(StandardCharsets.UTF_8))
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











