ANSI字符和UNICODE字符的转换

此方法经常用于VC写的DLL或ocx函数的返回值中,而且此DLL或ocx函数是供VB或JS调用的。

函数返回使用下面的格式返回

return SysAllocString((BSTR)wText);//wText是转换后的UNICODE字符串

return SysAllocString((BSTR)sText);//sText是转换后的多字节字符串

 

ANSI字符也叫多字节字符,短字符,汉字占用2个字节,ASCII字符占用1个字节,比如char sTemp[]="中间1";需要分配6个字节,最后一个字节是字符串结束字节(0值)。

UNICODE字符也叫宽字符,每一个字符(汉字或ASCII字符)占用2个字节(16位)。他们之间的相互转换使用下面两个函数

int MultiByteToWideChar(
  __in   UINT CodePage,//经常用CP_ACP
  __in   DWORD dwFlags,//经常为0
  __in   LPCSTR lpMultiByteStr,//多字节字符串
  __in   int cbMultiByte,//多字节字符串的长度,常用-1表示全部长度
  __out  LPWSTR lpWideCharStr,//转换后的UNICODE字符
  __in   int cchWideChar//存放UNICODE字符空间大小,
);

int WideCharToMultiByte(
  __in   UINT CodePage,,//经常用CP_OEMCP
  __in   DWORD dwFlags,//经常为0
  __in   LPCWSTR lpWideCharStr,//UNICODE字符串
  __in   int cchWideChar,//UNICODE字符串长度,常用-1表示全部长度
  __out  LPSTR lpMultiByteStr,//转换后的多字节字符串
  __in   int cbMultiByte,//存放多字节字符串空间的大小
  __in   LPCSTR lpDefaultChar,//经常为NULL
  __out  LPBOOL lpUsedDefaultChar//经常为FALSE
);

 

在不考虑空间浪费的情况下,转换较短的字符串(转换后字符空间在转换前固定,不使用动态分配),转换函数可封装成下面的两个函数

BOOL MByteToWChar(LPCSTR lpcszStr, LPWSTR lpwszStr, DWORD dwSize)
 {
    DWORD dwMinSize;


    dwMinSize = MultiByteToWideChar (CP_ACP, 0, lpcszStr, -1, NULL, 0);//得到实际需要的UNICODE字符空间大小
    if(dwSize < dwMinSize)
    {
     return FALSE;
    }
  
    MultiByteToWideChar (CP_ACP, 0, lpcszStr, -1, lpwszStr, dwMinSize);  
    return TRUE;
  }
/

BOOL WCharToMByte(LPCWSTR lpwszStr, LPSTR lpcszStr, DWORD dwSize)
  {
   DWORD dwMinSize;
   dwMinSize = WideCharToMultiByte(CP_OEMCP,NULL,lpwszStr,-1,NULL,0,NULL,FALSE);//得到实际需要的多字符空间大小
   if(dwSize < dwMinSize)
   {
    return FALSE;
   }


   WideCharToMultiByte(CP_OEMCP,NULL,lpwszStr,-1,lpcszStr,dwMinSize,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]));

如果字符串很长,则可以考虑使用动态分配

先使用

dwMinSize = MultiByteToWideChar (CP_ACP, 0, lpcszStr, -1, NULL, 0);//得到实际需要的UNICODE字符空间大小

dwMinSize = WideCharToMultiByte(CP_OEMCP,NULL,lpwszStr,-1,NULL,0,NULL,FALSE);//得到实际需要的多字符空间大小
得到实际需要的大小,然后分配空间

wchar_t *wText = new wchar_t[dwMinSize];

char *sText = new char[dwMinSize]
最后调用

MByteToWChar(sText, wText, dwMinSize);

WCharToMByte(wText, sText, dwMinSize);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值