Unicode与UTF-8

本文详细介绍了Unicode字符集的概念及其编码方式,并深入探讨了UTF-8编码如何通过变长编码来高效存储不同语言的字符。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Unicode

unicode是固定长度的字符集,最初由两个字节共16位表示。16位最多只能表示65536个字符。当需要表示各种语言的所有字符时,16位是不够用的。所以unicode4.0新增了一组附加字符集,附加字符集采用两个16位(注意,不是32位)来表示,最多可定义1048576个附加字符。
注意,unicode只是一组理论上的字符集。如果要在内存或者文件中表示字符,需要使用一定的编码方式来表示unicode。 utf-8就是unicode的一种实现编码规范。

utf-8

unicode算上附加字符集,需要使用两个字节以上的二进制来表示,姑且认为需要使用3个字节。而英文采用ASCII码,只需要使用一个字节。如果将一个ASCII码的文件用unicode来表示,文件大小将增加3倍,这是无法接受的。但是,一定要使用unicode,因为unicode定义了世界各个语言的字符,全世界通用,这也是unicode的初衷。于是一个合适的编码实现就非常重要。utf-8应运而生。
utf-8是变字节编码,根据unicode值,其实现可能为1、2、3、4……个字节。utf-8的每个字节的第一位都是1. 假设utf-8需要使用n个字节表示,第一个字节的前n位为1,n+1位为0,其他字节的前两位为10.其他位为unicode的映射位。
        

unicode 与 utf-8的对应关系

unicode                                    utf-8   
0x00000000 - 0x0000007F     1xxxxxxx
0x00000080 - 0x000007FF     110xxxxx 10xxxxxx
0x00000800 - 0x0000FFFF     1110xxxx 10xxxxxx 10xxxxxx
0x00010000 - 0x001FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
0x00200000 - 0x03FFFFFF    111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxxx
0x04000000 - 0x7FFFFFFF    1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxxx 10xxxxxx

utf-8中的所有x就是unicode的值。
总结utf-8字节数与unicode有效位数的关系:
 1字节 —— 1-7
 2字节 —— 8-11
 3字节 ——9-16
 4字节 ——17-21
 5字节 ——22-26
 6字节 ——27-31

所以,根据unicode的有效位数就能知道utf-8的字节数。
例如:汉字‘刘’的unicode值位:01010010 0001 1000
有效位数为15位,因此对应的utf-8为3个字节
utf-8为:11100101 10001000 10011000 
即E58898.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值