字符集
字符(Character)是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。字符集(Characterset)是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,常见字符集名称:ASCII字符集、GB2312字符集、BIG5字符集、GB18030字符集、Unicode字符集等。

1.单字节字符集
单字节字符集SBCS(Single-ByteChactacterSystem),它的所有字符都只有一个字节的长度。SBCS字符串由一个零字节结尾,数据类型是char。常见字符集有:ASCll码和扩展ASCll码。
| 类型 | 说明 |
|---|---|
| ASCII码 | ASCII码由一个字节中的7位(bit)表示,最高位空着,范围是0x00-0x7F共128个字符,用来表示大小写字母,数字0到9、标点符号,以及在美式英语中使用 的特殊控制字符。 |
| 扩展ASCII码 | 扩展ASClII码使用一个字节的全部8位(bit)来表示字符,范围是0x80-0xFF的128个字符,这128个扩充字符是由IBM制定的,并非标准的ASCII码.这些字符是用来 表示框线、音标和其它欧洲非英语系的字母。 |
2.多字节字符集
多字节字符集MBCS(Multi-ByteChactacterSystem),英文字符用一个字节表示,利用连续多个扩展ASCII码的扩展区域来表示一个汉字。MBCS字符串由一个零字节结尾,数据类型是char
| 类型 | 说明 |
|---|---|
| GB2312 (中国国家标准) | 每个汉字以两个字节来表示。 简体中文编码范围就从 OxA1A1-0xFEFE,收录6763个简体汉字,682个字符 (包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母)。 |
| BIG5 (中国台湾、中国香港) | 每个汉字以两个字节来表示。繁体编码范围: 其第一字节编码范围为 0xA1~0xF9,第二字节编码范围为 0x40-0x7E与0xA1-0xFE,共收录13053个中文字,1984年实施。 |
| GBK (中国国家标准) | 兼容GB2312标准。每个汉字以两个字节来表示。 汉字内码扩展规范,加入对繁体字的支持。 |
| GB18030 (中国国家标准) | 兼容GBK和GB2312标准。 GB18030字符集采用单字节、双字节和四字节三种方式对字符编码。 |
3.UNICODE字符集
Unicode字符集(UniversalMultiple-OctetCodedCharacterSet.通用多八位编码字符集,简称为UCS)是国际标谁化组织ISO为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的码值,以满足跨语言的要求。
Unicode只是一个字符集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。
3.1 UTF编码
UTF(UnicodeTransformationFormat,意为Unicode转换格式),UTF通过对Unicode码值进行对应规则转换后,编码写入到内存/文件中。
| 类型 | 说明 |
|---|---|
| UTF-8 | 可变长度的编码方式,使用1到4个字节编码UNICODE字符。对于英语字母, UTF-8编码和ASCII码是相同的,只需要1个字节。对于其中大部分汉字采用3个字节编码,少量汉字采用4个字节编码。 UTF-8编码不存在字节序大小端问题! |
| UTF-16 | UTF-16比起UTF-8,好处在于大部分汉字以固定长度2字节储存,少量汉字采用4字节编码。但 UTF-16却无法兼容于ASCIl编码。Windows默认的 Unicode编码就是UTF-16。UTF-16 编码有大端和小端之别,编码前会放置一个U+FEFF或U+FFFE。 |
| UTF-32 | UTF-32对每个字符都使用4字节。UTF-32与UTF-16一样有大端和小端之别,编码前会放置FEFF或FFFE以区分。 |
3.2 UTF编码的优缺点
| 类型 | 优缺点 |
|---|---|
| UTF-8 | 1.兼容ASCII、可以使用一个字节表示英语世界常用字符,适合存储和网络传输。 2.能适应许多C库中的\0结尾惯例 3.没有字节序问题 4.良好的多语种支持(相对GBK等跟语种绑定的编码方式) 5.以英文和西文符号比较多的场景下(例如HTML/XML),编码较短 6.字符空间足够大,可适应未来Unicode新标准收录更多字符 7.对中文的存储浪费空间 |
| UTF-16 | 1.UTF-16能表示的字符数有6万多,但Unicode5.0收录的字符已经达到9万多字 符,已超过UTF-16的存储范围; 2.UTF-16存在大小端字节序问题,存在大小端转换性能损失问题。 3.UTF-16的优点主要是考虑到它是双字节的,在计算字符串长度、执行索引操作时 速度很快。 4.对英语世界字符存储浪费空间。 |
| UTF-32 | 1.UTF-32的优点是定长的,在计算字符串长度、执行索引操作时速度很快。 2.对存储浪费空间。 |
4.多字节字符与宽字节字符
C++基本数据类型中表示字符的有两种:char、wchar_t。
char叫多字节字符,一个char占1个字节,之所以叫多字节字符是因为它表示一个英文字符时是一个字节,而中文字符时是多个字节。
wchar_t被称为宽字符,一个wchar_t占2个字节。之所以叫宽字符是因为所有的字都要用两个字节(即一个wchar_t)来表示,不管是英文还是中文。用常量字符给wchar_t变量赋值时,前面要加L,如:
c++wchar_t str[3]=L"中国";
注意:两种字符对应的字符串函数也不一样,strlen()对应wcslenO,strcpy()对应wcscpy(),一般把char类型函数中的"str" 替换为”wcs"即可。
5.vs切换字符集
先打开项目的属性设置
1.编辑器上方工具栏选择项目->选择属性
2.或者右边解决方案管理器右键项目->属性

配置属性->高级,将字符集切换为使用多字节字符集
接着应用->确定

6.Win32 api中的A/W函数
Win32APl中带字符串的APl一般都有两个版本,例如CreateFileA和CreateFileW。
当然也有例外,例如GetProcAddress函数。A代表ANSI编码,W代表Unicode字符集。
Windows中的Unicode字符一般指UCS2的UTF16-LE编码。
看如下预编译指令:
#ifdef UNICODE
#define MessageBox MessageBoxW
#else
#define MessageBox MessageBoxA
#endif