Skip to content

字符集

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

image-20240827170125288

1.单字节字符集

单字节字符集SBCS(Single-ByteChactacterSystem),它的所有字符都只有一个字节的长度SBCS字符串由一个零字节结尾,数据类型是char。常见字符集有:ASCll码和扩展ASCll码。

类型说明
ASCII码ASCII码由一个字节中的7位(bit)表示,最高位空着,范围是0x00-0x7F128
个字符,用来表示大小写字母,数字0到9、标点符号,以及在美式英语中使用
的特殊控制字符。
扩展ASCII码扩展ASClII码使用一个字节的全部8位(bit)来表示字符,范围是0x80-0xFF128
个字符,这128个扩充字符是由IBM制定的,并非标准的ASCII码.这些字符是用来
表示框线、音标和其它欧洲非英语系的字母。

2.多字节字符集

多字节字符集MBCS(Multi-ByteChactacterSystem),英文字符用一个字节表示,利用连续多个扩展ASCII码的扩展区域来表示一个汉字。MBCS字符串由一个零字节结尾,数据类型是char

类型说明
GB2312
(中国国家标准)
每个汉字以两个字节来表示。
简体中文编码范围就从OxA1A1-0xFEFE
收录6763个简体汉字,682个字符
(包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母)。
BIG5
(中国台湾、中国香港)
每个汉字以两个字节来表示。繁体编码范围:
其第一字节编码范围为0xA1~0xF9
第二字节编码范围为0x40-0x7E0xA1-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-16UTF-16比起UTF-8,好处在于大部分汉字以固定长度2字节储存,少量汉字采用4字节编码。
UTF-16却无法兼容于ASCIl编码。
Windows默认的Unicode编码就是UTF-16
UTF-16 编码有大端和小端之别,编码前会放置一个U+FEFFU+FFFE
UTF-32UTF-32对每个字符都使用4字节。
UTF-32UTF-16一样有大端和小端之别,编码前会放置FEFFFFFE以区分。

3.2 UTF编码的优缺点

类型优缺点
UTF-81.兼容ASCII、可以使用一个字节表示英语世界常用字符,适合存储和网络传输。
2.能适应许多C库中的\0结尾惯例
3.没有字节序问题
4.良好的多语种支持(相对GBK等跟语种绑定的编码方式)
5.以英文和西文符号比较多的场景下(例如HTML/XML),编码较短
6.字符空间足够大,可适应未来Unicode新标准收录更多字符
7.对中文的存储浪费空间
UTF-161.UTF-16能表示的字符数有6万多,但Unicode5.0收录的字符已经达到9万多字
符,已超过UTF-16的存储范围;
2.UTF-16存在大小端字节序问题,存在大小端转换性能损失问题。
3.UTF-16的优点主要是考虑到它是双字节的,在计算字符串长度、执行索引操作时
速度很快。
4.对英语世界字符存储浪费空间。
UTF-321.UTF-32的优点是定长的,在计算字符串长度、执行索引操作时速度很快。
2.对存储浪费空间。

4.多字节字符与宽字节字符

C++基本数据类型中表示字符的有两种:charwchar_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.或者右边解决方案管理器右键项目->属性

image-20240831214453953

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

接着应用->确定

image-20240831214627131

6.Win32 api中的A/W函数

Win32APl中带字符串的APl一般都有两个版本,例如CreateFileA和CreateFileW

当然也有例外,例如GetProcAddress函数。A代表ANSI编码,W代表Unicode字符集。

Windows中的Unicode字符一般指UCS2的UTF16-LE编码。

看如下预编译指令:

c++
#ifdef UNICODE
#define MessageBox MessageBoxW
#else
#define MessageBox MessageBoxA
#endif

MIT Licensed