Thinkingin MFC---Unicode字符转换
引言
在MFC编程中,使用Unicode环境时,在给CString str = “xinxipan”;这样的语句编译总是无法通过,需要修改成这样CStringstr = L“xinxipan”;这是因为CString是宽字节的,而”xinxipan”是一个非unicode字符串。所以这两者之间需要转换。
一、基础介绍
1.Unicode字符串
Unicode的详细介绍可以在网上查到,这里只做简单介绍。
Unicode是一种通用于国际的编码方式,它包含了世界上所有的文字和符号。Unicode用数字0-0x10FFFF来映射这些字符。
Unicode的几种编码方案:UTF-8、UTF-16和UTF-32。
2. MultiByteToWideChar
int MultiByteToWideChar(
_In_ UINT CodePage,
_In_ DWORD dwFlags,
_In_ LPCSTR lpMultiByteStr,
_In_ int cbMultiByte,
_Out_opt_ LPWSTRlpWideCharStr,
_In_ int cchWideChar
);
函数作用:
该函数映射一个字符串到一个宽字符(unicode)的字符串。
参数介绍:
1. CodePage:之前我们将到的Unicode,那么各个国家的文字如何和Unicode之间转换,就要靠CodePage,CodePage为各国文字和Unicode提供了一种映射。
这里我们需要知道几个常用的CodePage值:简体中文是CP936,繁体中文是CP950,UTF-8是65001;
2. dwFlags:设定转换的类型,这里我们需要设置为0;
3. lpMultiByteStr:待转换的字符串;
4. cbMultiByte:lpMultiByteStr的字节数;如果设置为-1,那么函数会处理lpMultiByteStr整个字符串;如果设为0,那么这个函数将会失败;
5. lpWideCharStr:用于接收转换完成的字符串;
6. cchWideChar:lpWideCharStr的字节数,如果该参数为0,函数返回所需要的字节数,包括字符串的终止符,并且lpWideCharStr参数不会被使用。
详细可参见:这里
3. WideCharToMultiByte
int WideCharToMultiByte(
_In_ UINT CodePage,
_In_ DWORD dwFlags,
_In_ LPCWSTR lpWideCharStr,
_In_ int cchWideChar,
_Out_opt_ LPSTRlpMultiByteStr,
_In_ int cbMultiByte,
_In_opt_ LPCSTRlpDefaultChar,
_Out_opt_ LPBOOLlpUsedDefaultChar
);
函数作用:
该函数映射一个宽字符(unicode)的字符串到一个字符串。
参数介绍:
1. CodePage:与MultiByteToWideChar中相同,略;
2. dwFlags:设定转换的类型,这里我们需要设置为0;
3. lpWideCharStr:待转换的Unicode字符串;
4. cchWideChar:lpWideCharStr的字节数;如果设置为-1,那么函数会处理lpWideCharStr整个字符串;如果设为0,那么这个函数将会失败;
5. lpMultiByteStr:用于接受转换完成的字符串;
6. cbMultiByte:lpMultiByteStr的字节数,如果该参数为0,函数返回所需要的字节数,包括字符串的终止符,并且lpMultiByteStr参数不会被使用。
7. lpDefaultChar:是一个可选参数,这里我们设置为NULL;
8. lpUsedDefaultChar:lpMultiByteStr的字节数;如果设置为-1,那么函数会处理lpMultiByteStr整个字符串;如果设为0,那么这个函数将会失败;
详细可参见:这里
二、代码实现
在这里提供这个算法的实现代码:
Unicodeto Multi
string CStringConvertUtil::ConvertUnicodeToMulti(LPCWSTRpwszSrc,UINT nCodePage)
{
int nLen =WideCharToMultiByte(nCodePage,0,pwszSrc,-1,"",0,NULL,NULL);
if(nLen <= 0)
return "";
char * buf = new char[nLen];
int nRes =WideCharToMultiByte(nCodePage,0,pwszSrc,-1,buf,nLen,NULL,NULL);
if(0 == nRes)
return "";
stringstrRes = buf;
delete[] buf;
return strRes;
}
Multi to Unicode
wstring CStringConvertUtil::ConvertMultiToUnicode(LPCSTRpszSrc,UINT nCodePage)
{
int nLen =MultiByteToWideChar(nCodePage,0,pszSrc,-1,L"",0);
if(nLen <= 0)
return L"";
WCHAR *buf = new WCHAR[nLen];
int nRes =MultiByteToWideChar(nCodePage,0,pszSrc,-1,buf,nLen);
if(0 == nRes)
return L"";
wstringstrRes = buf;
delete[] buf;
return strRes;
}
三、总结
开始编程不久,便接触到了MFC。用了MFC写了自己第一个视窗程序,写了第一个游戏,在学校课题演示的时候也是喜欢用MFC做演示。
现在工作了,项目的界面部分也在使用MFC开发的,值得庆幸的是,现在微软对于MFC的界面做了很大的改善,想起刚开始不断重写控件类,那个真是记忆犹新。
在平时编程的时候,VS这个集成工具确实很方便。但现在想把一些MFC零零碎碎的知识整合起来。所以这个系列可能会深入地去介绍MFC。