UTF-8
UTF-8 是 Unicode 的一种变长字节编码:它把每个 Unicode 码点(code point)用 1 到 4 个字节表示。它向下兼容 ASCII——U+0000–U+007F 的字符仍占 1 字节,字节值与 ASCII 完全一致,所以纯英文文本的 UTF-8 与 ASCII 逐字节相同。这也是它成为 Web 事实标准编码的原因之一。
编码规则靠首字节的高位标记出总字节数,后续字节一律以 10 开头,便于定位字符边界、容错:
- 1 字节:
0xxxxxxx(ASCII) - 2 字节:
110xxxxx 10xxxxxx - 3 字节:
1110xxxx 10xxxxxx 10xxxxxx(大部分汉字在此,占 3 字节) - 4 字节:
11110xxx …(emoji、生僻字等)
几个常见误区:一是 UTF-8 不等于 Unicode——Unicode 只是字符到码点的映射表,UTF-8 是把码点落成字节的方案之一(同类还有 UTF-16、UTF-32)。二是字节数不等于字符数,一个汉字通常 3 字节、一个 emoji 常 4 字节,用字节长度当字符数会出错。三是 UTF-8 与字节序无关、不需要 BOM,加了 BOM 反而可能让某些程序解析出错,存文件时建议选「无 BOM 的 UTF-8」。
常见问题
UTF-8 和 Unicode 是一回事吗?
不是。Unicode 是字符集,规定每个字符对应的码点(如「中」= U+4E2D);UTF-8 只是把码点编成字节的具体方案之一,UTF-16、UTF-32 也是编码方案。
一个汉字在 UTF-8 里占几个字节?
常见汉字(基本多文种平面)占 3 个字节,ASCII 字符占 1 字节,部分 emoji 和生僻字占 4 字节。因此直接用字节长度当字符数会不准,按字符计数才对。
保存文件要不要加 UTF-8 BOM?
一般不建议。UTF-8 与字节序无关,不需要 BOM;PHP、shell 脚本等工具遇到开头的 BOM 反而可能出错,通常选「无 BOM 的 UTF-8」更保险。