Thinking in MFC---Unicode字符转换

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。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值