编码解码(字符集)

1.基础概念

计算机中储存的信息都是用二进制数表示的,而我们在屏幕上看到的英文、汉字等字符是二进制数转换之后的结果。通俗的说,按照何种规则将字符存储在计算机中,如’a’用什么表示,称为”编码”;反之,将存储在计算机中的二进制数解析显示出来,称为”解码”,如同密码学中的加密和解密。在解码过程中,如果使用了错误的解码规则,则导致’a’解析成’b’或者乱码。

1.1 字符集

字符集(Charset):是一个系统支持的所有抽象字符的集合。字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。

1.2 字符编码

字符编码(Character Encoding):即一套法则,在符号集合与数字系统之间建立对应关系。通常人们用符号集合(一般情况下就是文字)来表达信息。而以计算机为基础的信息处理系统则是利用数字(0/1)来存储和处理信息的。因此字符编码就是将符号转换为计算机可以存储的数字。

2.基础知识

常见字符集名称:ASCII字符集、GB2312字符集、GB18030字符集、Unicode字符集等。计算机要准确的处理各种字符集文字,需要进行字符编码,以便计算机能够识别和存储各种文字。

2.1 ASCII字符集&编码

ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统。它主要用于显示现代英语,而其扩展版本EASCII则可以显示其他西欧语言。它是现今最通用的单字节编码系统。

1) ASCII字符集:

ASCII字符集:主要包括控制字符(回车键、退格、换行键等);可显示字符(英文大小写字符、阿拉伯数字和西文符号)。

2) ASCII编码:

ASCII编码:将ASCII字符集转换为计算机系统可以存储的数字的编码规则。使用7位(bits)表示一个字符,共128字符;但是7位编码的字符集只能支持128个字符,为了表示更多的欧洲常用字符对ASCII进行了扩展,ASCII扩展字符集使用8位(bits)表示一个字符,共256字符。

2.2. GBXXXX字符集&编码

计算机发明之初,只用应用于美国及西方一些发达国家,ASCII能够很好的满足需求。但是当天朝也有了计算机之后,为了显示中文,必须设计一套用于将汉字转换为计算机可以存储的数字的编码。

GB 2312 标准共收录 6763 个汉字,GB 2312 对任意字符都采用双字节表示
GBK 共收入 21886 个汉字和图形符号,GBK 对任意字符都采用双字节表示
GB 18030 共收录汉字70244个,GB 18030 编码是一二四字节变长编码。其单字节,与 ASCII 编码兼容。
注:GBK兼容GB2312,GB18030兼容GBK

2.3 Unicode字符集&编码

Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案,记录着世界上所有字符对应的一个数字。

1) UTF-8编码

UTF-8 是目前互联网上使用最广泛的一种 Unicode 编码方式,它的最大特点就是可变长。它可以使用 1 - 4 个字节表示一个字符,根据字符的不同变换长度。

UTF-8以字节为单位对Unicode进行编码。从Unicode到UTF-8的编码方式如下:
Unicode编码(十六进制) UTF-8字节流(二进制)
000000—00007F 0xxxxxxx
000080—0007FF 110xxxxx 10xxxxxx
000800—00FFFF 1110xxxx 10xxxxxx 10xxxxxx
010000—10FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
UTF-8的特点是对不同范围的字符使用不同长度的编码。对于0x00—0x7F之间的字符,UTF-8编码与 ASCII 编码完全相同。

对于需要使用 N 个字节来表示的字符(N > 1),第一个字节的前 N 位都设为 1,第 N + 1 位设为0,剩余的 N - 1 个字节的前两位都设位 10,剩下的二进制位则使用这个字符的 Unicode 码点来填充。
例1:“汉”字的Unicode编码是0x6C49。0x6C49在0x0800-0xFFFF之间,使用3字节模板:1110xxxx 10xxxxxx 10xxxxxx。将0x6C49写成二进制是:0110 1100 0100 1001, 用这个比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。

2.4 Base64字符集&编码

Base64要求把每三个8Bit的字节转换为四个6Bit的字节(3*8 = 4*6 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。
编码解码(字符集)_第1张图片

1) 数据正好3字节

例如: “ABC”
UTF-8编码后: 01000001 01000010 01000011
转换 : 00010000 00010100 00001001 00000011
结果: “QUJD”

2) 数据剩余2字节

例如: “AB”
UTF-8编码后: 01000001 01000010
转换 : 00010000 00010100 00001000
结果: “QUI=”

2个字节16位,base64进行编码时,每6位一组,最后一组只有4位,右侧需要用”00”补齐,编码后的结果添加一个”=”

3) 数据剩余1字节

例如: “A”
UTF-8编码后: 01000001
转换 : 00010000 00010000
结果: “QQ==”

1个字节8位,base64进行编码时,每6位一组,最后一组只有2位,右侧需要用”0000”补齐,编码后的结果添加一个”==”

你可能感兴趣的:(编码解码(字符集))