1、计算机的字符集有三种
单字节字符集(SBCS)、多字节字符集(MBCS)、宽字节字符集(Unicode字符集)。计算机的每个字符都要使用一个编码表示,每个字符集使用哪一种编码则是由所采用的字符集所决定。
单字节字符集:它的所有字符都只有一个字节的长度。具体实现有:ASCII字符集和扩展ASCII字符集。
多字节字符集:英文和欧洲字符采用一个字节表示,其他国家如中文采用2个字节表示。各个国家有自己的字符集。
操作系统通过代码页给各种字符集定义编号,便于区分。
包含多字节字符集的中文信息软件不能在其他字符集的系统上正确的显示,所以应该使用Unicode编码
宽字节字符集:是一种纯理论的东西,与具体的计算机无关,规定了任一语言的任一字符都有一个唯一的代码点,由16进制书写,并加上U+前缀。故有所有字符集以及其Unicode编码构成的集合称为Unicode字符集。
Unicode码有16位,ASCII码有8位,如 'A'的ASCII码是0x41(65),Unicode编码是0x0041.
最初定义的16位(UC2版本)不够用,所以又出现了个32位(UC4版本),它表示某个字符的代码点,并将代码点分为17个代码平面,其中U+000~U+FFFF属于基本语言平面,U+10000~U+10FFFF属于辅助平面。
并不是所有的代码平面都对应有字符,有些是保留的,有些有特殊作用。
2、Unicode的编码实现
1)UTF-8
以字节为单位对Unicode进行编码,这里的单位是指程序解析二进制流时的最小单元,也就是说是通过一个字节一个字节地去解析文本。
2)UTF-16
以16位无符号整数为单位进行编码,也就是把Unicode码点转换为16进制比特长为一个单位的二进制串,用来进行数据存储与传输,即通过16位二进制串为一个单位来解析。
3)UTF-32
以32位无符号整数为单位进行编码,Unicode码点的UTF-32编码就是该码点值,简单,但是会造成数据数据的浪费和传输低效,由于大部分人使用的字符编码不超过2个字节,使用UTF-32,则会浪费。
3、十六进制数在CPU内存中的存放方式(编码单元字节序)
1)大端模式:将一个数的高位字节存储在起始地址,其他部分顺序存储。
例如,0x1234
大端模式下:
内存地址 | 0x8000 | 0x8001 |
存放的数据 | 0x12 | 0x34 |
2)小端模式:将一个数的低字节存储在起始地址,其他部分顺序存储。
例如,0x12345678
小端模式下:
内存地址 | 0x8000 | 0x8001 | 0x8002 | 0x8003 |
存放的数据 | 0x78 | 0x56 | 0x34 | 0x12 |
4、各种运行库对Unicode字符集的支持
1)CRT,C运行时库,定义了一种叫宽字符类型的数据类型,一个字符占用两个字节,之前的是一个字符占用一个字节。L、_T、__T和_TEXT三者的功能相同,都是要求编译器将其后面的字符串按照Unicode字符集保存。
并且还定义了相应的宽字符类型的字符串函数。
2)C++标准库,有相应的宽字符版本的wstring,但是没有提供统一的函数形式。可以自己去定义。
3)WindowAPI,有两个版本,一个是以A结束的函数形式,针对多字节字符集。另一个是以W为结束的函数形式,针对Unicode字符集。
4)VC++开发环境,支持多字节字符集和Unicode字符集,可以在设置中进行修改。