ASCII,Unicode,UTF-8,GBK,ANSI字符编码比较

本文详细解析了Unicode、GBK、UTF-8等编码方式的特点与适用场景,包括它们的字节数、编码规则及其与ASCII的关系。

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

 

一般而言Unicode,GBK,UTF-8编码字节数如下表所示

字节数

英文/数字(半角)

中文

Unicode/UTF-16

2

2

GBK

1

2

UTF-8

1

3

 

1.ASCII

标准ASCII,其最高位(b7)用作奇偶校验位。
扩展ASCII 字符是从128到255(0x80-0xff)的字符。 扩展ASCII不再是国际标准。
ASCII太短,肯定不能作为编码实现方案,但是可以用其作为一部分。

 

2.Unicode

Unicode也是编码方式不是实现方式,windows用txt保存的Unicode格式其实是utf-16。Unicode 编码系统,可分为编码方式(UCS-2,UCS-4)和实现方式(UTF-8、UTF-16、UTF-32)两个层次。UTF-8、UTF-16、UTF-32都是将数字转换到程序数据的编码实现方案。有几个平面。可以认为就是用从0开始的数值表示字符,跟具体编码无关。
UNICODE是统一码联盟组织定义的编码。
UCS是国际标准化组织iso开展的ISO/IEC 10646项目定义的编码。
统一码的编码方式与ISO 10646的通用字符集概念相对应。目前实际应用的统一码版本对应/等价于UCS-2,使用16位的编码空间。也就是每个字符占用2个字节。这样理论上一共最多可以表示216(即65536)个字符。基本满足各种语言的使用。实际上当前版本的统一码并未完全使用这16位编码,而是保留了大量空间以作为特殊使用或将来扩展。

上述16位统一码字符构成基本多文种平面。最新(但未实际广泛使用)的统一码版本定义了16个辅助平面,两者合起来至少需要占据21位的编码空间,比3字节略少。但事实上辅助平面字符仍然占用4字节编码空间,与UCS-4保持一致。未来版本会扩充到ISO 10646-1实现级别3,即涵盖UCS-4的所有字符。UCS-4是一个更大的尚未填充完全的31位字符集,加上恒为0的首位,共需占据32位,即4字节。理论上最多能表示231个字符,完全可以涵盖一切语言所用的符号。
基本多文种平面的字符的编码为U+hhhh,其中每个h代表一个十六进制数字,与UCS-2编码完全相同。而其对应的4字节UCS-4编码后两个字节一致,前两个字节则所有位均为0。
关于统一码和ISO 10646及UCS的详细关系,见通用字符集。

 

3.UTF-8

UTF-8 单字节和标准ASCII/相同,多字节有2-4字节三种情况。UTF-8使用1~4字节为每个字符编码:一个US-ASCIl字符只需1字节编码(Unicode范围由U+0000~U+007F)。带有变音符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文等字母则需要2字节编码(Unicode范围由U+0080~U+07FF)。其他语言的字符(包括中日韩文字、东南亚文字、中东文字等)包含了大部分常用字,使用3字节编码。其他极少使用的语言字符使用4字节编码。UTF-8编码规则:如果只有一个字节则其最高二进制位为0;如果是多字节,其第一个字节从最高位开始,连续的二进制位值为1的个数决定了其编码的字节数,其余各字节均以10开头。

 

UTF-16 Unicode字符的码位,需要1个或者2个16位长的码元来表示,因此这是一个变长表示。UTF-16比起UTF-8,好处在于大部分字符都以固定长度的字节 (2字节) 储存,但UTF-16却无法兼容于ASCII编码。

 

4.GBK

GBK编码,是在GB2312-80标准基础上的内码扩展规范,使用了双字节编码方案,其编码范围从8140至FEFE(剔除xx7F),共23940个码位,共收录了21003个汉字,完全兼容GB2312-80标准,支持国际标准ISO/IEC10646-1和国家标准GB13000-1中的全部中日韩汉字,并包含了BIG5编码中的所有汉字。

GBK 采用双字节表示,总体编码范围为 8140-FEFE,首字节在 81-FE 之间,尾字节在 40-FE 之间,剔除 xx7F 一条线。总计 23940 个码位,共收入 21886 个汉字和图形符号,其中汉字(包括部首和构件)21003 个,图形符号 883 个。

 

5.ANSI

ANSI在不同国家地区编码不一样,是本地码。GBK是中国本地码。
ANSI(注意拼写不是ASCII)并不是“一种”编码,而是“多种”编码的统称。在简体中文Windows上,ANSI指GBK编码;在繁体中文Windows上,ANSI指Big5编码;在英文Windows上,ANSI指cp437编码。

 

 

其他

如果一个仅包含基本7位ASCII字符的Unicode文件,如果每个字符都使用2字节的原Unicode编码传输,其第一字节的8位始终为0。这就造成了比较大的浪费。对于这种情况,可以使用UTF-8编码,这是一种变长编码,它将基本7位ASCII字符仍用7位编码表示,占用一个字节(首位补0)。而遇到与其他Unicode字符混合的情况,将按一定算法转换,每个字符使用1-3个字节编码,并利用首位为0或1进行识别。这样对以7位ASCII字符为主的西文文档就大幅节省了编码长度(具体方案参见UTF-8)。类似的,对未来会出现的需要4个字节的辅助平面字符和其他UCS-4扩充字符,2字节编码的UTF-16也需要通过一定的算法进行转换。


BOM Big-Endian Little-Endian 在UCS 编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE"。这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。因此字符"ZERO WIDTH NO-BREAK SPACE"又被称作BOM。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值