由于在工作中经常会遇到数据在各种不同数据库流转的需要,偶尔会碰到一些中文乱码的情况,借此机会,记录一下一些常见的字符集和字符编码。
字符:各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。
字符集:多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同。
字符编码:把字符集中的字符编码为(映射)指定集合中的某一对象(例如:比特模式、自然数序列、电脉冲)的一种规则,以便文本在计算机中存储和通过通信网络的传递。通常特定的字符集采用特定的编码方式(即一种字符集对应一种字符编码(例如:ASCII、IOS-8859-1、GB2312、GBK,都是即表示了字符集又表示了对应的字符编码,但Unicode不是,它采用现代的模型))
常见字符集名称:ASCII字符集、GB2312字符集、BIG5字符集、GB18030字符集、Unicode字符集等。
计算机要准确的处理各种字符集文字,需要进行字符编码,以便计算机能够识别和存储各种文字。
首先咱们来认识下单字节和双字节的概念,在计算机中,1byte=8bit,byte即字节,bit为位,1字节为8位;注:在本文示例中,“x”代表0或1
单字节 xxxxxxxx
双字节 xxxxxxxx xxxxxxxx
ASCII字符集:ASCII ((American Standard Code for Information Interchange): 美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准,并等同于国际标准ISO/IEC 646。ASCII第一次以规范标准的类型发表是在1967年,最后一次更新则是在1986年,到目前为止共定义了128个字符。
我们今天首先来讲讲ASCII字符集,首先来看ASCII字符集包含了哪些字符:
ASCII字符集采用的是单字节编码,且只使用了单字节中的低7位,最高位是没有使用的,可表示为0xxxxxxxx;可以看到,ASCII字符集共包含128个字符,在英语国家中,128个字符是基本够用的,但是,在其他国家语言中,比如,在法语中,字母上方有注音符号,它就无法用 ASCII 码表示。于是,一些欧洲国家就决定,利用字节中闲置的最高位编入新的符号。比如,法语中的é的编码为130(二进制10000010)。这样一来,这些欧洲国家使用的编码体系,可以表示最多256个符号。但是,这里又出现了新的问题。不同的国家有不同的字母,因此,哪怕它们都使用256个符号的编码方式,代表的字母却不一样。比如,130在法语编码中代表了é,在希伯来语编码中却代表了字母Gimel (ג),在俄语编码中又会代表另一个符号。但是不管怎样,所有这些编码方式中,0--127表示的符号是一样的,不一样的只是128--255的这一段。
至于亚洲国家的文字,使用的符号就更多了,汉字就多达10万左右。一个字节只能表示256种符号,肯定是不够的,就必须使用多个字节表达一个符号。比如,简体中文常见的编码方式是 GB2312,使用两个字节表示一个汉字,所以理论上最多可以表示 256 x 256 = 65536 个符号。
GB2312编码:1980年3月9日发布,1981年5月1日实施的简体中文汉字编码国家标准,“GB”就是”国标“二字的简称,GB2312对汉字采用双字节编码,收录7445个图形字符,其中包括6763个汉字。
GB2312字符集构成一个94行、94列的二维表,每一个汉字或符号在码表中的位置用它所在的区号和位号来表示,称为区位码,区位码中数字的表示采用的都是十进制。ASCII采用的是单字节编码方式,而GB2312采用的则是双字节编码,第一个字节为“高字节”,即区号,第二个字节为”低字节“,即位号;每个区都是从01到94,所以区位码可表示的字符个数范围为0101-9494,二进制表示为(00000001 000000001-01011110 01011110),目前有一部分区留空未使用,具体情况如下:
01-09区收录除汉字外的682个字符。
10-15区为空白区,没有使用。
16-55区收录3755个一级汉字,按拼音排序。
56-87区收录3008个二级汉字,按部首/笔画排序。
88-94区为空白区,没有使用。
此处以1区和16区来举例,1区中的“。”的区号是01(二进制表示为0001),位号是03(二进制为0011),则“。”的区位码是0103(00000001 00000011),16区中的“啊”的区位码是1601(00010000 00000001)
1区 | ||||||||||
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
0 | 、 | 。 | · | ˉ | ˇ | ¨ | 〃 | 々 | ||
1 | — |