为什么每个汉字在UTF-8中必须占3个字节?90%程序员不知道的编码原理!


在计算机的世界里,数据的存储和传输都依赖于编码。编码就像是一种语言规则,规定了如何将我们人类能理解的字符(如汉字、字母、数字等)转换为计算机能够识别和处理的二进制数字。

一、编码的起源和发展

早期,计算机主要在英语国家使用,ASCII 码应运而生。ASCII 码用一个字节(8 位)来表示字符,总共可以表示 128 个字符,包括英文字母、数字、标点符号等。然而,世界上有众多的语言和字符,ASCII 码远远无法满足需求。于是,随着计算机在全球的普及,各种各样的编码方式开始出现,其中就包括处理汉字的编码。

二、汉字编码的发展历程

汉字数量庞大,常用汉字就有数千个,这意味着需要更多的编码空间来表示它们。在早期,针对汉字有 GB2312、GBK 等编码方式。GB2312 收录了 6763 个常用汉字,它使用两个字节来表示一个汉字。GBK 在 GB2312 的基础上进行了扩展,收录了更多的汉字,同样也是用两个字节表示大部分汉字。

但随着互联网的发展,不同国家和地区的信息交流日益频繁,需要一种能够统一表示世界上所有字符的编码标准,这就是 Unicode。Unicode 为世界上几乎所有的字符都分配了一个唯一的编号,称为码点。

三、UTF - 8 编码的诞生

UTF - 8 是Unicode 标准的一种实现方式,它是一种可变长度的字符编码,能用 1 - 4 个字节编码任意 Unicode 字符 。它与 ASCII 码兼容,ASCII 码字符在 UTF - 8 中仍用 1 个字节表示,并且能高效表示其他字符,包括汉字。

(一)UTF - 8 的编码规则:

  1. 单字节字符(与 ASCII 兼容):对于码点在 0 - 127 之间的字符(也就是 ASCII 码中的字符),UTF - 8 用一个字节表示,且字节的最高位为 0。例如,字符 ‘A’ 的 ASCII 码是 65,在 UTF - 8 中同样表示为 01000001。

  2. 多字节字符:

    对于码点大于 127 的字符,UTF - 8 采用多个字节来表示。具体规则如下:

    • **2 字节:**第一个字节的前两位是 110,后面六位是码点的一部分;第二个字节的前两位是 10,后面六位是码点的另一部分。
    • **3 字节:**第一个字节的前三位是 1110,后面五位是码点的一部分;第二个字节的前两位是 10,后面六位是码点的一部分;第三个字节的前两位是 10,后面六位是码点的一部分。
    • **4 字节:**第一个字节的前四位是 11110,后面四位是码点的一部分;后面三个字节的前两位都是 10,后面六位是码点的一部分。

  • 1字节0xxxxxxx,用于表示0到127的字符(ASCII字符)。
  • 2字节110xxxxx 10xxxxxx,用于表示128到2047的字符。
  • 3字节1110xxxx 10xxxxxx 10xxxxxx,用于表示2048到65535的字符。
  • 4字节11110xxx 10xxxxxx 10xxxxxx 10xxxxxx,用于表示65536到1114111的字符。

(二)汉字在 UTF - 8 中为何占 3 字节:

汉字的 Unicode 码点范围比较大,大部分常用汉字的码点都落在需要用 3 字节 UTF - 8 编码表示的区间内。以汉字 “中” 为例,其 Unicode 码点是 20013,二进制为 100111000101101。按照 UTF - 8 的 3 字节编码规则:

  • 第一个字节:前三位 1110,后五位是码点二进制前五位,即 11100100。
  • 第二个字节:前两位 10,后六位是码点二进制接下来六位,即 10111000。
  • 第三个字节:前两位 10,后六位是码点二进制剩余六位,即 10101101。

所以,“中” 字在 UTF - 8 中的编码是 E4 B8 AD(十六进制表示),刚好占用 3 个字节。需注意,少部分生僻字码点位置更靠后,需 4 个字节进行 UTF - 8 编码。

四、UTF - 8 编码的优势

  1. 兼容性:由于 UTF - 8 对 ASCII 码的兼容,使得大量基于 ASCII 码开发的软件和系统可以很容易地过渡到支持 UTF - 8,降低了升级成本。
  2. 灵活性:变长编码方式使得 UTF - 8 可以高效地表示不同类型的字符。对于 ASCII 字符,用一个字节就可以,节省存储空间;对于像汉字这样的字符,根据其码点范围使用合适的字节数来表示。
  3. 网络传输友好:在网络传输中,UTF - 8 的变长编码方式可以减少传输的数据量。例如,如果一段文本中大部分是 ASCII 字符,只有少量汉字,使用 UTF - 8 编码可以比固定长度编码(如每个字符都用 2 字节或 4 字节)传输的数据量小。

五、UTF-8编码的应用场景

  1. 网页显示:全球绝大多数网站采用 UTF - 8 编码,确保网页内容能正确显示各种语言字符。访问维基百科时,无论中文、英文、日文、阿拉伯文等页面,都能准确呈现,若网站未采用 UTF - 8 编码,可能出现乱码。例如在中文系统下访问用错误编码编写的含日文内容的网页,日文部分可能显示为乱码。
  2. 数据库存储:许多数据库管理系统支持 UTF - 8 编码,用于存储不同语言文本数据。MySQL 数据库创建表时可指定字符集为 UTF - 8,实现多语言数据统一管理。如跨国电商平台数据库存储不同国家用户的姓名、地址等信息,用 UTF - 8 编码可确保信息准确存储,避免字符集问题导致数据丢失或错误。
  3. 文件存储:日常文件处理中,UTF - 8 编码应用广泛。用文本编辑器创建包含多种语言的文本文件,选择以 UTF - 8 编码保存,可保证在不同操作系统和软件中打开文件时内容正确显示。一份多国语言的技术文档,采用 UTF - 8 编码存储后,在 Windows 系统下用记事本或 Mac 系统下用 TextEdit 打开,都能看到正常文字内容。
  4. 移动应用开发:在移动应用开发中,UTF - 8 编码也发挥着重要作用。当开发一款面向全球用户的移动应用时,需要支持多种语言的用户界面文本。例如,一款社交类应用,用户来自不同国家和地区,其聊天界面、菜单选项、提示信息等都可能包含多种语言。使用 UTF - 8 编码,能够确保在不同语言环境下,应用中的文本都能正确显示和处理,提升用户体验。

六、总结

理解汉字在 UTF - 8 中占 3 个字节的原理,不仅有助于程序员在处理字符编码相关问题时更加得心应手,也让我们对计算机底层的信息处理机制有更深入的认识。UTF - 8 编码以其独特的设计,在全球信息交流中扮演着至关重要的角色,成为了现代计算机系统和网络应用中广泛使用的编码方式。希望通过本文,能让更多的人了解这一编码背后的奥秘,在编程和日常使用计算机的过程中,更好地处理字符相关的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值