Windows中两种多字符与宽字符的转换方法

在Windows中经常需要用到多字符与宽字符的转换方法,所以多字符(MultiChar)也就是ANSI编码的方式,而宽字符(WideChar)也就是Unicode编码的方式。


首先是两种传统的转换方法,分别是MutiByteToWideChar和WideCharToMutiByte。


int MultiByteToWideChar(

  UINT CodePage,

  DWORD dwFlags,

  LPCSTR lpMultiByteStr,

  int cchMultiByte,

  LPWSTR lpWideCharStr,

  int cchWideChar

  );


这是多字符转换为宽字符的方法,6个参数的含义为:CodePage(多字符所对应的的字符集,一般是CP_ACP), dwFlags(一些标准位,一般不需要使用,置0即可),lpMultiByteStr(多字符的地址),cchMultiBytes(多字符的字符串长度,相当于字符串的字节数,如果是1,则由函数判断长度), lpWideCharStr(宽字符的地址),cchWideChar(宽字符的字符长度,相当于字符串的个数)。上面的两个长度都是包含‘\n’的长度。

如果lpWideCharStr不为NULL,返回转换成功的长度;如果lpWideCharStr为NULL,返回lpMultiByteStr的字符个数(不是字符串长度!!!)。


常用的用法为:

//先将lpWideCharStr置成NULL,从而得到szText的长度。
int iBuffSize = ::MultiByteToWideChar(CP_ACP, 0, szText, -1, NULL, 0);
//判断字符长度是否大于0
if (iBuffSize > 0)
{
    LPWSTR wszString = new wchar_t[iBuffSize+1];
    int nChars = ::MultiByteToWideChar(CP_ACP, 0, szText, -1,     wszString, iBuffSize);
    //这是担心转换失败,从而nChars为0,再讲wszString置成空字符串
    nChars = nChars < iBuffSize ? nChars:iBuffSize;
    wszString[nChars] = 0;
}


另一个是宽字符到多字符:

int WideCharToMultiByte(

  UINT  CodePage ,
  DWORD  dwFlags ,
  LPCWSTR  lpWideCharStr ,
  i nt  cchWideChar ,
  LPSTR  lpMultiByteStr ,
  int  cchMultiByte ,
  LPCSTR  lpDefaultChar ,
  LPBOOL  pfUsedDefaultChar
  );


这里比MultiByteToWideChar多两个参数,而前面的六个参数都是一样的,lpDefaultChar的作用是当函数遇到一个不能转换的宽字符时,会用lpDefaultChar来代替,如果lpDefaultChar为NULL时,则用?代替。pfUsedDefaultChar的作用是如果有一个字符没有成功转换,则pfUsedDefaultChar为TRUE,否则为FALSE。

int iBuffSize = ::WideCharToMultiByte(CodePage, 0, szString, -1, NULL, 0, NULL, false);
if (iBuffSize > 0 )
{
    m_pString = new char[iBuffSize];
    ::WideCharToMultiByte(CodePage, 0, szString, -1, m_pString, iBuffSize, NULL, false);
}

另两种转换的方法是A2W和W2A,分别表示多字符到宽字符,宽字符到多字符。这两个函数式atl的函数,所以需要加上头文件<atlconv.h>

USES_CONVERSION;
wchar_t wszText[]=L"1.Unicode字符转换为ANSI;";
char szText[]="2.ANSI字符转换成Unicode.";
printf("%s\n",W2A(wszText));
wprintf(L"%s\n",A2W(szText));

注意的是每做一个转换前,一定要加上USES_CONVERSION。


不过要注意是不要在大循环或者非常长的函数中使用W2A或者A2W,因为有内存溢出的问题。




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值