首页 » 其他 » ASCII、GB2312、GBK、Unicode 、UTF-8等编码的字节长度问题

ASCII、GB2312、GBK、Unicode 、UTF-8等编码的字节长度问题

 

ASCII

占用 1 个字节的长度

这种编码应该是最熟悉的,还记得当初学 C 语言时课本附录的 ASCII 编码表吧,一共128个字符,所以说一个字节的长度就可以存放 ASCII 编码的字符(128个字符用一个字节的后7位保存,第一位规定为0),但这中编码只是针对英文进行编码,它无法表示其他字符。

GB2312

占用1-2个字节的长度

GB2312 是对 ASCII 编码的一个扩展,共收录6763个汉字,同时收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个字符。它基本满足汉字的需要,但是一些生僻字还是无法编码。

它在内存中根据字符不同占用的长度也不同,在存储 ASCII 编码中存在的字符时,占用1个字节,其他的占用2个字节。

为了与 ASCII 编码兼容,占用两个字节的字符中,所占的每个字节的二进制第一位都是1,换句话说就是,在读取汉字时,读到第一个字节大于127,会继续读下一个字节,下一个字节一定是一个大于127的数(第一位是1),这样的缺点是浪费空间,GBK 编码就是解决这个问题的。

GBK

占用1-2个字节的长度

上面说了,GBK 编码是解决 GB2312 编码的第二个字节二进制码首位必须是1的问题,完全兼容 ASCII 编码和 GB2312 编码,在 GBK 编码中,占用两个字节的字符的第二个字节的数值无需大于127,这点改变,使 GBK 编码比 GB2312 编码多出一万多个字符,共收录21886个汉字和图形符号。

Unicode

如果有一种编码,将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码,那么乱码问题就会消失。这就是 Unicode,就像它的名字都表示的,这是一种所有符号的编码。

Unicode只是一个编码规范,目前实际实现的 Unicode 编码有三种:UTF-8,UTF-16 和 UTF-32,

UTF-8

占用1-4个字节长度

UTF-8 是 Unicode 的实现方式之一。其最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。

UTF-8 的编码规则很简单,只有二条:

1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的。

2)对于n字节的符号(n > 1),第一个字节的前n位都设为1,第n + 1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。

下表总结了编码规则,字母x表示可用编码的位。

跟据上表,解读 UTF-8 编码非常简单。如果一个字节的第一位是0,则这个字节单独就是一个字符;如果第一位是1,则连续有多少个1,就表示当前字符占用多少个字节。

在UTF-8中汉字用3个字符来表示。

UTF-16

占用2或4个字节

UTF-16 也是 Unicode 编码的一种实现方式,在有的文档中,Unicode 编码包括 UTF-8,UCS-2 和 UTF-32,没有 UTF-16,,其实 UTF-16 可看成是 UCS-2 的父集。在没有辅助平面字符(surrogate code points)前,UTF-16 与 UCS-2 所指的是同一的意思。但当引入辅助平面字符后,就称为 UTF-16 了。现在若有软件声称自己支持 UCS-2 编码,那其实是暗指它不能支持在 UTF-16 中超过2字节的字集。

UTF-32

占用4个字节

在 UTF-32 编码中,任何一个字符都占用4个字节,优点是不需要复杂的算法,只需为每个字符分配编码即可,缺点是浪费空间大,使用并不广泛。

结语

之前在公司上班时遇到一个问题,项目的测试环境和正式环境中,数据库的某个表使用的编码不同(不知道负责的人怎么迁移的),测试环境使用 GBK 编码,正式环境成了 UTF-8 编码,这就导致了一个问题,本来测试数据库设置的字段长度是够用的,但在正式环境抛异常说超出字段最大长度,经过错误定位后才发现是编码不一致,只能扩字段的长度,如果修改编码的话可能会导致乱码的问题。

当时就想把所有的编码原理都看一遍,奈何工作太多,没有时间,现在终于有时间,就研究了一下。

目前使用最广泛的编码格式是 UTF-8,各种编码格式之间可以互相转换。

Unicode 在很长一段时间内无法推广,直到互联网的出现。

 

参考:

字符编码笔记:ASCII,Unicode 和 UTF-8——阮一峰

ASCII、GB2312、GBK、Unicode、UTF-8、UTF-16 编码方式比较分析

GB 2312——维基百科

汉字内码扩展规范——维基百科

Unicode——维基百科

原文链接:ASCII、GB2312、GBK、Unicode 、UTF-8等编码的字节长度问题,转载请注明来源!

0