MultiByteToWideChar和WideCharToMultiByte

  首先定义一个多字节字符串: char sText[20] = {"多字节字符串!OK!"};

  我们需要知道转化后的宽字符需要多少个数组空间.虽然在这个里程里面,我们可以直接定义一个20*2宽字符的数组,并且事实上将运行得非常轻松愉快.但假如多字节字符串更多,达到上千个乃至上万个,我们将会发现其中浪费的内存将会越来越多.所以以多字节字符的个数的两倍作为宽字符数组下标的声明绝对不是一个好主意.所幸,我们能够确知所需要的数组空间.我们只需要将MultiByteToWideChar()的第四个形参设为-1,即可返回所需的短字符数组空间的个数:

  DWORD dwNum =MultiByteToWideChar (CP_ACP, 0, sText, -1, NULL, 0);

接下来,我们只需要分配响应的数组空间:

wchar_t *pwText;
  pwText = new wchar_t[dwNum];
  if(!pwText)
  {
    delete []pwText;
  }

  接着,我们就可以着手进行转换了.在这里以转换成ASCII码做为例子:
  MultiByteToWideChar (CP_ACP, 0, psText, -1, sText, dwSize);最后,使用完毕当然要记得释放占用的内存:
delete []psText;

  同理,宽字符转为多字节字符的代码如下:

wchar_t wText[20] = {L"宽字符转换实例!OK!"};
DWORD dwNum = WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,NULL,0,NULL,FALSE);
char *psText;
psText = new char[dwNum];
if(!psText)
{
   delete []psText;
}
WideCharToMultiByte (CP_OEMCP,NULL,lpcwszStr,-1,psText,dwNum,NULL,FALSE);
delete []psText;

  如果之前我们已经分配好空间,并且由于字符串较短,可以不理会浪费的空间,仅仅只是想简单地将短字符和宽字符相互转换,那有没有什么简便的方法呢?
WIN32 API里没有符合这种要求的函数,但我们可以自己进行封装:

//-------------------------------------------------------------------------------------
//Description:
// This function maps a character string to a wide-character (Unicode) string
//
//Parameters:
// lpcszStr: [in] Pointer to the character string to be converted
// lpwszStr: [out] Pointer to a buffer that receives the translated string.
// dwSize: [in] Size of the buffer
//
//Return Values:
// TRUE: Succeed
// FALSE: Failed
//
//Example:
// MByteToWChar(szA,szW,sizeof(szW)/sizeof(szW[0]));
//---------------------------------------------------------------------------------------
BOOL MByteToWChar(LPCSTR lpcszStr, LPWSTR lpwszStr, DWORD dwSize)
{
// Get the required size of the buffer that receives the Unicode
// string.
DWORD dwMinSize;
dwMinSize = MultiByteToWideChar (CP_ACP, 0, lpcszStr, -1, NULL, 0);

if(dwSize < dwMinSize)
{
return FALSE;
}


// Convert headers from ASCII to Unicode.
MultiByteToWideChar (CP_ACP, 0, lpcszStr, -1, lpwszStr, dwMinSize);
return TRUE;
}

//-------------------------------------------------------------------------------------
//Description:
// This function maps a wide-character string to a new character string
//
//Parameters:
// lpcwszStr: [in] Pointer to the character string to be converted
// lpszStr: [out] Pointer to a buffer that receives the translated string.
// dwSize: [in] Size of the buffer
//
//Return Values:
// TRUE: Succeed
// FALSE: Failed
//
//Example:
// MByteToWChar(szW,szA,sizeof(szA)/sizeof(szA[0]));
//---------------------------------------------------------------------------------------
BOOL WCharToMByte(LPCWSTR lpcwszStr, LPSTR lpszStr, DWORD dwSize)
{
DWORD dwMinSize;
dwMinSize = WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,NULL,0,NULL,FALSE);
if(dwSize < dwMinSize)
{
return FALSE;
}
WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,lpszStr,dwSize,NULL,FALSE);
return TRUE;
}

  使用方法也很简单,示例如下:

wchar_t wText[10] = {L"函数示例"};
char sText[20]= {0};
WCharToMByte(wText,sText,sizeof(sText)/sizeof(sText[0]));
MByteToWChar(sText,wText,sizeof(wText)/sizeof(wText[0]));

  这两个函数的缺点在于无法动态分配内存,在转换很长的字符串时可能会浪费较多内存空间;优点是,在不考虑浪费空间的情况下转换较短字符串非常方便.

wchar_t wText[20] = {L"宽字符转换实例!OK!"};
DWORD dwNum = WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,NULL,0,NULL,FALSE);
char *psText;
psText = new char[dwNum];
if(!psText)
{
delete []psText;
}
WideCharToMultiByte (CP_OEMCP,NULL,lpcwszStr,-1,psText,dwNum,NULL,FALSE);
delete []psText;

实际上在windows开发中,尤其的unicode工程,可能大部分的初学者都会感觉到头疼,确实是有关字符的转换的确很麻烦。这里贴出一个微软MSDN的转换字符链接,给大家分享一下,http://msdn.microsoft.com/en-us/library/ms235631.aspx 。加油!

参考链接:http://www.cxy.me/doc/3143.htm

 

转载于:https://www.cnblogs.com/ZhouL3777/archive/2012/12/12/2815409.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MultiByteToWideCharWideCharToMultiByte是Windows API函数,用于进行字符集转换。其中,MultiByteToWideChar函数将多字节字符转换为宽字符,而WideCharToMultiByte函数则将宽字符转换为多字节字符。下面是它们的使用方式: MultiByteToWideChar函数的使用方式: ``` int MultiByteToWideChar( UINT CodePage,//字符集编码 DWORD dwFlags,//转换标志 LPCSTR lpMultiByteStr,//待转换的多字节字符 int cbMultiByte,//待转换的多字节字符长度 LPWSTR lpWideCharStr,//用于接收转换结果的缓冲区 int cchWideChar//缓冲区长度 ); ``` WideCharToMultiByte函数的使用方式: ``` int WideCharToMultiByte( UINT CodePage,//字符集编码 DWORD dwFlags,//转换标志 LPCWSTR lpWideCharStr,//待转换的宽字符 int cchWideChar,//待转换的宽字符长度 LPSTR lpMultiByteStr,//用于接收转换结果的缓冲区 int cbMultiByte,//缓冲区长度 LPCSTR lpDefaultChar,//未能转换的字符用于替代的字符集 LPBOOL lpUsedDefaultChar//是否替换字符 ); ``` CodePage参数指定了字符集的编码方式,常用的字符集如UTF-8、GBK等。 dwFlags参数可以控制字符集转换的行为,例如控制是否使用默认字符集替换无法转换的字符。 lpMultiByteStr和lpWideCharStr参数分别为待转换的多字节字符和宽字符。 cbMultiByte和cchWideChar参数分别指定了转换缓冲区的长度。 使用时,需要根据实际情况调用这两个函数进行字符集转换。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值