基础概念:
在VS中 :
**多字节字符集**指的是ANSI编码,在中文操作系统中为GB2312编码;
**UNICODE字符集**指的是unicode字符集;
mfc里面存储汉字: 宽字符(TCHAR ,wchar)默认使用unicode字符集,且是UTF-16 编码方式;
多字节字符(CHAR,char)默认使用ANSI编码,如'中' GB2312编码为 0xD6D0;unicode字符编码为0x4E2D;
WideCharToMultiByte 函数初解:
函数原型:
int WideCharToMultiByte( UINT CodePage,
DWORD dwFlags,
LPCWSTR lpWideCharStr,
int cchWideChar,
LPSTR lpMultiByteStr,
int cbMultiByte,
LPCSTR lpDefaultChar,
LPBOOL lpUsedDefaultChar);
此函数的功能是将宽字符转换成多字节字符,本质是将字符从UNICODE字符集UTF-16编码方式转换成UTF-8编码方式或ANSI编码;(UTF-8 和UTF-16的区别读者自行了解)。
此处只说明第一个参数的含义,CodePage:代码页 指的是转换是使用哪一种编码,而且指的是多字节字符的编码方式,在上面的函数中指的是第五个参数(LPSTR lpMultiByteStr)的编码,在MultiByteToWideChar()函数中指的是第三个参数的编码。因为mfc里面宽字符的编码方式默认就是UTF-16。
此参数常用的取值是 CP_ACP (ANSI编码)和 CP_UTF8。
示例:将宽字符串”中文“ 装换成多字节字符串(ANSI编码: 中:0xD6D0 文:0xCEC4)
小端序问题:
一般情况下计算机是使用小端序存储字符,即数据的低位字节存放在低地址,数据高位字节存放在高地址位。
如上一个示例中有如下数组:TCHAR szTest[3] = _T(“中文”);
发现: szTest[0] 值为0x4E2D ;
szTest[1] 值为0x6587;
也就是unicode编码下面的"中"字和"文"字;数据位似乎并没有反向;
但其实使用memcpy函数按字节拷贝数据时:
CHAR cWord[6] = {0};
memcpy(cWord,szTest,6);
会发现:
cWord[0] 的值是0x2D;
cWord[1]的值是0x4E; 确实是小端序,一个TCHAR宽字符占两个字节 ,在字符内部的确是小端序