(1)Windows中,Unicode也称为宽字节,多字节也称为窄字节; VS中默认使用Unicode编码,在项目属性>>配置属性>>常规>>字符集中可选择Unicode字符集或者多字节字符集windows
(2) Unicode与多字节函数版本、字符、字符串类型的区别网络
Win32 API中大部分参数有字符串的函数都有两个版本函数
以A结尾,表明多字节版本 | 以W结尾,表明Unicode版本 | 根据版本自动选择的 |
---|---|---|
如:CreateEventA | 如:CreateEventW | 如:CreateEvent |
C运行库也有不少相似的函数编码
多字节版本 | Unicode版本 | 自适应版本 |
---|---|---|
strcpy | wcscpy | _tcscpy |
strcat | wcscat | _tscscat |
strlen | wcslen | _tcslen |
函数有两种,因此字符也有两种操作系统
多字节字符 | Unicode字符 | 自适应字符 |
---|---|---|
char | wchar_t | TCHAR |
(3) 常见Win32字符串类型3d
LPSTR、LPWSTR、LPTSTR、LPCTSTR指针
LP前缀,表明指针;STR后缀表明字符串code
LPSTR:表明多字节blog
LPWSTR:表明Unicode内存
LPTSTR:T自适应
LPCTSTR:C表明const+T表明自适应
备注:变量类型使用自适应类型后如LPTSTR,相关字符串须要用TEXT()进行包裹
const char* str = "hello"; const wchar_t* wstr = L"hello"; const TCHAR* tstr = TEXT("hello");
(4)关于_T()
#ifdef _UNICODE #define _T(X) L ## X //Unicode版本 #else #define _T(X) X //多字节版本 #endif
(5)Unicode与多字节的选择
1.Unicode程序环境适应能力强,不会出现乱码问题
2.Unicode程序运行速度比多字节程序快。缘由:Windows内部都是使用Unicode编码,多字节函数会将参数转码后交给Unicode函数
3.控制后台可以使用多字节,GUI程序最好使用Unicode
(1)Unicode实现方式:UTF-32
以4个byte为编码单元进行定长存储,调度器一次性下发4个byte进行存储任务
主要有两种方式:
大端法UTF-32BE:地址由小向大增长,而数据从高位往低位放 ,在网络上传输数据广泛采用的都是大端
小端法UTF-32LE:地址由小向大增长,而数据从低位往高位放,在英特尔处理器,Windows10操做系统,采用小端法。
(2)UTF-16
也有大小端模式
UTF-16 LE是windows上默认的Unicode编码方式,使用wchar_t表示。全部wchar_t *类型的字符串(包括硬编码在.h/.cpp里的字符串字面值)
char chinese[] = "你"; //大小为3个byte,一个char存储结束符,两个char存储汉字字符‘你’ 1char:1byte wchar_t wchinese[] = L"你"; //大小为4个byte, 一个wchar_t存储结束符,一个wchar_t存储汉字字符‘你’ 1wchar_t:2byte(window下) auto size = sizeof(chinese); // 3 byte auto wsize = sizeof(wchinese); // 4 byte auto len = strlen(chinese); // 2个字符(除去结束符) auto wlen = wcslen(wchinese); // 1个字符(除去结束符)
优点:就是大多数状况下一个wchar_t表示一个字符(包括中文字符)
坑:char *类型的字面值,最终内存使用何种编码方式彻底取决于当前文件的编码方式
备注:在Windows上应该铭记没有char / std::string这种类型的字符/字符串,只有wchar_t / char16_t / std::wstring / std::u16string
(3)UTF-8
优点:无字节序的概念,不用考虑大小端问题,适用与字符串的网络数据传输
劣势:如上代码,一个char并不能表示一个汉字字符,每每须要两个char
(1)概念
能够认为ANSI / MBCS (多字节字符集) / 本地编码是同一个概念,不一样的国家和地区制定了不一样的标准,有GB23十二、GBK、GB18030、Big五、Shift_JIS 等各自的编码标准,ASCII就是美国国家的ANSI标准,一个国家的代码到另外一个国家使用,有可能因为编码标准不一致,致使乱码,因而才有了万国码Unicode,各国通用。