一、 字符编码
1. ASCII(单字存储)
ASCII码使用单字存储,即8位存储,所以最多只能编码256个字符,主要为西文服务。ASCII码划分为两个集合:128个字符的标准ASCII码和附加的128个字符的扩充ASCII码。
2. ANSI(单字存储,也可以理解为单双字混存)
ANSI是ASCII字符集的扩充,在存储ASCII字符的时候,就使用ASCII编码单字存储(标准ASCII码,第8位为0);而在存储像中文这样需要双字存储的字符时,使用两个扩充ASCII码(扩充ASCII码,第8位为1),系统解码时找两个扩充码解码。
简体中文字符编码GB-2312就是ANSI字符集,由6763个常用汉字和682个全角的非汉字字符组成,一些生僻字是显示不出来的。
ANSI字符集的缺点就是国际不通用,在简体中文操作系统中 ANSI 编码代表 GB2312 编码,在日文操作系统下,ANSI 编码代表 JIS 编码,解码时可能最终显示的是中文,也可能显示的是日文。
3. Unicode(双字存储,Unicode编码标准中也有4字存储标准)
可以表示65536个字符。将世界上几乎所有语言的常用字符收录其中,方便了信息交流(与ANSI编码不同,Unicode编码国际通用,每个编码代表世界上唯一的一个字符)。标准的Unicode称为UTF-16。前128个字符位和ASCII码兼容,例如,在ASCII码中‘A’为单字0x41
,在ANSI中‘A’为双字0x0041
。
4. UTF-8,UTF-16和UTF-32。
Unicode用一些基本的保留字符制定了三套编码方式。它们分别是UTF-8,UTF-16和UTF-32。正如名字所示,在UTF-8中,字符是以8位序列来编码的,用一个或几个字节来表示一个字符。这种方式的最大好处,是UTF-8保留了ASCII字符的编码做为它的一部分,例如,在UTF-8和ASCII中,“A”的编码都是0x41.
UTF-16和UTF-32分别是Unicode的16位和32位编码方式。
二、 编程中的字符编码
- 在Windows编程中,调用库函数时有两种库函数,一种是以“A”结尾的ANSI版本函数,另一种是以“W”结尾的Unicode版本函数。
- A型函数传参时必须传入ANSI字符串
- W型函数传参时必须传入Unicode字符串
三、 多字节字符集和Unicode字符集
- 如果在编译器设置中将字符集设置成多字节字符集,那么在编译时系统会把字符串编码为ANSI字符串;
- 如果设置成Unicode字符集,那么将编码为Unicode字符串。
- 如果在字符串前加上字母“L”,不管编译器设置如何,字符串都将编译为Unicode字符串
四、 Unicode与ANSI之间转换字符串?
- character string 表示多字符集字符集字符串
wide-character string 表示Unicode字符串
Windows函数:
MultiByteToWideChar将多字节字符串转换成宽字符串;
WideCharToMultiByte将宽字符串转换成多字节字符串。