UTF-8编码

竞赛/基础

UTF-8 编码规则与合法性判断

UTF-8 编码基本规则

UTF-8 是一种可变长度的 Unicode 编码方式,使用 1 到 4 个字节表示一个字符。

字节结构模式

字符长度 第一个字节范围 第一个字节模式 后续字节模式 表示的 Unicode 范围
1 字节 0 x 00-0 x 7 F 0xxxxxxx U+0000 - U+007 F
2 字节 0 xC 0-0 xDF 110xxxxx 10xxxxxx U+0080 - U+07 FF
3 字节 0 xE 0-0 xEF 1110xxxx 10xxxxxx U+0800 - U+FFFF
4 字节 0 xF 0-0 xF 7 11110xxx 10xxxxxx U+10000 - U+10 FFFF

合法性判断要点

1. 起始字节模式

  • 必须符合上述四种模式之一
  • 不能出现 0xFF0xFE0xFD 等无效起始字节

2. 连续字节模式

  • 多字节序列中,第二个及后续字节必须以 10 开头(范围 0 x 80-0 xBF)

3. 编码效率原则

  • 不能使用更长的字节序列表示本可以用更短序列表示的字符(禁止过度编码)
  • 例如:ASCII 字符(0 x 00-0 x 7 F)必须用单字节表示

4. Unicode 有效性

  • 编码的码点必须在有效 Unicode 范围内(U+0000 到 U+10 FFFF)
  • 不能编码代理对区域(U+D 800 到 U+DFFF)

示例分析

✅ 合法的 UTF-8 序列

  • 0 xF 0 0 x 90 0 x 80 0 x 80:4 字节序列,表示 U+10000
    • 第一个字节:0 xF 0 = 11110000
    • 后续字节:0 x 90 = 10010000, 0 x 80 = 10000000, 0 x 80 = 10000000
    • 码点 U+10000 在有效范围内 ✓

❌ 非法的 UTF-8 序列

A. 0 xC 0 0 x 80

  • 过度编码:表示 U+0000,但应使用单字节 0 x 00
  • 违反编码效率原则

C. 0 x 80 0 x 80 0 x 80

  • 缺少有效的起始字节
  • 所有字节都是连续字节模式,没有起始字节

D. 0 xFF 0 xFE 0 xFD

  • 第一个字节 0 xFF = 11111111 不符合任何起始字节模式
  • 后续字节也不完全符合连续字节模式

快速检查方法

  1. 检查起始字节:确认第一个字节符合四种有效模式之一
  2. 检查连续字节:确认后续字节都以 10 开头
  3. 检查编码效率:确认没有用长序列编码短序列字符
  4. 检查码点范围:确认编码的 Unicode 码点有效

常见错误

  • 过度编码:用多字节表示单字节字符
  • 不完整序列:缺少连续字节
  • 无效起始字节:使用了不符合规范的起始字节
  • 码点越界:编码了无效的 Unicode 码点

掌握这些规则后,就能快速判断任何字节序列是否为合法的 UTF-8 编码。

posted @ 2025-11-17 16:36  stephen_zuo  阅读(1)  评论(0)    收藏  举报