一. 基本概念
1、字符集
字符集是指各种文字和符号的集合,包括各个国家文字、标点符号、图形符号、数字等。
2、编码字符集
编码字符集是所有字符以及对应代码值的集合。编码字符集中的每个字符都对应一个唯一的代码值。这些代码值就称为码点值(code point),可以看做字符在编码字符集中的编号。
常见的编码字符集:ASCII字符集
、GBXXXX字符集
、BIG5字符集
、Unicode字符集
等。
3、字符编码方式
是将编码字符集中的字符代码值转换为实际的存储字节序列的一种映射规则。
编码字符集中只规定了字符的代码值并未规定具体如何存储,字符编码方式解决了字符在计算机中如何存储的问题。
常见字符编码方式:ASCII编码
、GBXXXX编码
、BIG5编码
、UTF-8编码
、UTF-16编码
、UTF-32编码
等。
4、编码字符集与编码方式间对应关系
每种编码字符集至少对应一种字符编码方式,也可以对应多种编码方式。
二. 字符集与编码
1、ASCII字符集&编码
ASCII字符集:即美国信息交换标准码,分为标准ASCII码和扩展ASCII码。
- 标准ASCII:标准ASCII字符集共有128个字符,其中有96个可打印字符,包括常用的英文字母、数字和标点符号等,同时还有32个控制字符。
编码方式:标准ASCII编码是采用7位编码方式,以1个字节存储一个ASCII字符,字节最高位为0,即00000000-01111111
或0x00-0x7F
。 - 扩展ASCII:由于标准ASCII字符集字符有限,往往无法满足实际需求,因此国际标准组织制定了在与标准ASCII规范相兼容的前提下将ASCII字符集扩充为8位代码的方法。
每种扩充ASCII字符集可以扩充128个字符,这些扩充字符的编码均为最高位为1的8位代码。扩充的ASCII字符集即为扩展ASCII字符集,编码方式称为扩展ASCII编码。
编码方式:常见的一种扩展ASCII为ISO-8859-1(也称为Latin-1)编码规范,用于支持部分欧洲语言。
2、GBXXXX字符集&编码
是指中国汉字编码字符集以及后续扩展的一系列规范,包括GB2312-80
、GBK
、GB18030
。
- GB2312-80:中国国家标准简体中文字符集,全称为《信息交换用汉字编码字符集-基本集》,包括了
6763
个常用汉字和682
个全角的非汉字字符。
编码方式:GB2312编码的另一种表示方法为EUC-CN
,采用双字节编码,其中汉字的区码和位码各占一个字节,每个汉字占两个字节的存储空间。由于区码和位码的取值范围都为1—94,如果直接将其值作为存储值,会导致与ASCII码冲突,实际存储时将区码和位码分别加上0xA0的方式转换为存储码(也称为内码)。比如,汉字“啊”,区位码为1601(0x1001)
,其存储码为0xB0A1
,0xB0 = 0x10+0xA0
,0xA1 = 0x01 + 0xA1
。编码范围:0xA1A1~0xFEFE
。 - GBK:全称为《汉字内码扩展规范》。GBK兼容GB2312内码,是对GB2312内码的扩展,共收录了21003个汉字,883个字符,包含了简体、繁体中文以及日语、朝鲜语中的汉字。
编码方式:GBK编码方式采用双字节编码,占用两个字节的存储空间,编码范围是0x8140~0xFEFE
,不包括xx7F编码
。windows对应代码页是CP936
。 - GB18030:全称为《信息技术中文编码字符集》。GB18030完全兼容GB2312-80内码,基本兼容GBK内码,是目前最新的中国国家编码字符集标准,共收录了70244个字符,增加了对CJK统一汉字扩充A、CJK统一汉字扩充B以及少数民族文字等字符的支持。windows对应的代码页为CP54936。
编码方式:GB18030编码采用变长多字节编码方式,包括1字节、2字节或4字节编码。单字节编码与ASCII码相同,双字节编码与GBK编码相同并增加了一些扩展,四字节用于扩充汉字的编码,第一、三字节的编码范围为:0x81—0xFE
,第二、四字节的编码范围为:0x30—0x39
。
3、UCS字符集&编码
UCS即通用字符集,是ISO组织为了统一所有语言的文字和符号而制定的编码字符集。编码方式包括:UCS-2和UCS-4
- UCS-2编码:针对UCS字符集的编码方式,采用双字节编码,只对基本平面(BMP)内的字符编码,即码点范围在
0x0000~0xFFFF
之间的字符编码。
4、Unicode字符集&编码
Unicode字符集是统一码联盟为了统一所有语言的文字和符号而制定的编码字符集。编码方式包括:UTF-8
、UTF-16
和UTF-32
。Unicode字符集分为17个平面,其中0号平面为基本面(BMP)占用2字节,其他平面为辅助平面占用4字节。
- UTF-8编码:UTF-8编码是针对Unicode字符集的可变长度字符编码。UTF-8兼容ASCII字符编码,对于ASCII字符只占一个字节,对于其他字符占用多个字节,其第一个字节从最高位开始,连续的二进制位为1的个数决定了编码占用的字节数,其余字节均以10开头,最多可占用6个字节。
UTF-8中可以用来表示字符编码的实际位数最多为31位,即上表中x的个数;除去控制位剩余的x表示的位与Unicode中的码值是一一对应的,顺序也是一致的。 - UTF-8带BOM与不带BOM:UTF-8是与字节序无关的,UTF-8可以带BOM也可以不带BOM,UTF-8带BOM是在字节流前边增加3个字节(0xEFBBBF)的前缀,用来说明编码格式为UTF-8。UTF-8不带BOM才是标准形式,带BOM是微软的习惯,在其他操作系统中一般都是采用不带BOM的形式。
- UTF-16编码:针对Unicode字符集的编码方式,采用2字节或4字节长度编码,对于基本平面(BMP)内的字符编码采用2字节与UCS-2编码相同,超出基本平面的字符编码采用4字节编码。
UTF-16与UCS-2编码在存储和传输时会有两种不同的字节序,即big endian(大端)和litte endian(小端)。大端序是高字节在前低字节在后,小端序是低字节在前高字节在后,比如汉字“啊”(U+554A),大端序为0x554A,小端序为0x4A55。
为了说明字节流的顺序,需要在字节流前加上BOM(字节序标记),0xFEFF表示大端序,0xFFFE表示小端序。
对应的编码名称有:UCS-2BE、UCS-2LE、UCS-2、UTF-16BE、UTF-16LE、UTF-16。
Unicode字符集和UCS字符集(通用字符集)的编码表是相互兼容的,即每个字符在字符集中的位置(码位)是一致的。
5、ANSI编码
ANSI编码是指系统默认的编码方式,Windows可以在命令窗口中通过chcp指令查看系统默认编码。
- 简体中文系统:ANSI编码为
GBK
或GB2312
。 - 英文系统:ANSI编码为
ASCII码
。 - 繁体中文系统:ANSI编码为
BIG-5
。
6、源字符集编码
C++源字符集是指编写C++源程序的所有字符。源字符集编码主要指编写的源代码在磁盘中存储的编码格式。VS2015中可以通过“文件”-》“高级保存选项”-》指定当前源代码存储在磁盘中的编码格式
。
VS2015源字符集编码格式默认是GBK格式,建议保存成UTF-8的格式。
7、可执行字符集编码
可执行字符集编码是C/C++语言的程序编译后字符所使用的编码方式,即对可执行文件.obj
所使用的一种编码格式。编译器在编译时会将源代码中的字符常量和字符串常量转换为可执行字符集指定的编码方式。
VS中可以使用#pragma execution_character_set(“编码方式”)
预编译指令设置源文件中的可执行字符集使用的编码方式。
C++11中也可以直接使用u8、u、U前缀直接指定字符或字符串常量的编码方式。
三、总结
字符集 | 是否定长 | 编码方式 | 其他说明 |
标准ASCII | 是 | 单字节7位编码 | 最早的奠基性字符集 |
扩展ASCII(ISO-8859-1(也称为Latin-1)) | 是 | 单字节8位编码 | 用于支持部分欧洲语言 |
GB2312-80 | 是 | 双字节编码 | 早期标准,不推荐在使用 |
GBK | 是 | 双字节编码 | 对GB2312内码的扩展 |
GB18030 | 否 | 变长多字节编码 | 单字节编码和ASCII编码相同,双字节编码同GBK编码 并增加了一些扩展,四字节编码是用于扩充汉字的编码 |
UCS(通用字符集) | 是 | UCS-2编码(双字节编码) | ISO组织为了统一所有语言的文字和符号 而制定的编码字符集,Windows2000内部用UCS-2 |
Unicode字符集 | 否 | UTF-8编码(1~4字节编码) | UTF-8兼容ASCII字符编码,对于ASCII字符 只占一个字节,对于其他字符占用多个字节 |
Unicode字符集 | 否 | UTF-16编码(2/4字节编码) | Java和Windows XP/NT等内部使用UTF-16 |
Unicode字符集 | 否 | UTF-8编码(1~4字节编码) | UTF-8兼容ASCII字符编码,对于ASCII字符 只占一个字节,对于其他字符占用多个字节 |
ANSI编码 | 系统默认的编码方式,不同系统中编码方式有所不同 | ||
源字符集编码 | 编写的源代码在磁盘中存储的编码格式,VS2015 源字符集编码格式默认是GBK格式,建议保存成UTF-8的格式。 |
||
可执行字符集编码 | 可用#pragma execution_character_set(“编码方式”) 预编译指令设置VS源文件中的可执行字符集使用的编码方式 |
戳戳小手帮忙点个免费的赞和关注吧,嘿嘿。 |