MultiByteToWideChar和WideCharToMultiByte

标签: Win32API(系统调用) Win32API(系统调用)
12人阅读 评论(0) 收藏 举报
分类:

MultiByteToWideChar将多字节字符串转换为宽字符字符串,函数原型如下:

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形式:

1)调用MultiByteToWideChar,为lpWideCharStr传入NULL,为cchWideChar传入0,为cbMultiByte传入-1;

2)分配一块足以容纳转换后的Unicode字符串的内存,它的大小是1)中函数返回值乘以sizeof(wchar_t);

3)再次调用MultiByteToWideChar,这次将缓冲区地址作为lpWideCharStr参数的值传入,将1)中函数返回值乘以sizeof(w_char_t)后得到的大小作为cchWideChar参数的值传入;

4)使用转换后的字符串;

5)释放Unicode字符串占用的内存块。


下面是我们封装的多字节字符串转Unicode字符串的函数和字符字符串转换为多字节字符串函数:

int ToWideString( WCHAR* &pwStr, const char* pStr, int len, BOOL IsEnd)  
{  
    ASSERT_POINTER(pStr, char);  
    ASSERT(len >= 0 || len == -1);  
    int nWideLen = MultiByteToWideChar(CP_ACP, 0, pStr, len, NULL, 0);  
    if (len == -1)  
    {  
        --nWideLen;  
    }  
    if (nWideLen == 0)  
    {  
        return 0;  
    }  
    if (IsEnd)  
    {  
        pwStr = new WCHAR[(nWideLen+1)*sizeof(WCHAR)];  
        ZeroMemory(pwStr, (nWideLen+1)*sizeof(WCHAR));  
    }  
    else  
    {  
        pwStr = new WCHAR[nWideLen*sizeof(WCHAR)];  
        ZeroMemory(pwStr, nWideLen*sizeof(WCHAR));  
    }  
    MultiByteToWideChar(CP_ACP, 0, pStr, len, pwStr, nWideLen);  
    return nWideLen;  
}  

int ToMultiBytes( char* &pStr, const WCHAR* pwStr, int len, BOOL IsEnd)  
{  
    ASSERT_POINTER(pwStr, WCHAR) ;  
    ASSERT( len >= 0 || len == -1 ) ;  
    int nChars = WideCharToMultiByte(CP_ACP, 0, pwStr, len, NULL, 0, NULL, NULL);  
    if (len == -1)  
    {  
        --nChars;  
    }  
    if (nChars == 0)  
    {  
        return 0;  
    }  
    if(IsEnd)  
    {  
        pStr = new char[nChars+1];  
        ZeroMemory(pStr, nChars+1);  
    }  
    else  
    {  
        pStr = new char[nChars];  
        ZeroMemory(pStr, nChars);  
    }  
    WideCharToMultiByte(CP_ACP, 0, pwStr, len, pStr, nChars, NULL, NULL);  
    return nChars;  
}  

//调用方式如下:
char *pStr = "ASCE1885";
WCHAR *pwStr;
int nWideLen = ToWideString(pwStr, pStr, -1, TRUE);


WCHAR *pwStr = _T("ASCE1885");
char *pStr;
int nWideLen = ToMultiBytes(pStr, pwStr, -1, TRUE);


查看评论

linux没有WideCharToMultiByte,MultiByteToWideChar,我们通常...

Linux下面的没有命名为 WideCharToMultiByte() 和 MultiByteToWideChar() 函数,WideCharToMultiByte,MultiByteToWideCh...
  • yiyaaixuexi
  • yiyaaixuexi
  • 2011-02-08 23:07:00
  • 20842

MultiByteToWideChar和WideCharToMultiByte的正确使用方法及参数详解

本文内容摘自《Windows核心编程》(第五版)Page26。   文中已经详细阐述了这两个函数的用法,我这里仅仅作为备忘录。函数的参数请参考百度百科MultiByteToWideChar和Wide...
  • ccfxue
  • ccfxue
  • 2016-03-30 11:27:50
  • 1547

linux没有WideCharToMultiByte,MultiByteToWideChar 相应的处理

Linux下面的没有命名为 WideCharToMultiByte() 和 MultiByteToWideChar() 函数,WideCharToMultiByte,MultiByteToWideCh...
  • educast
  • educast
  • 2013-10-20 08:55:43
  • 2222

Unicode UTF-8 Ansi 互转及MultiByteToWideChar和WideCharToMultiByte用法等编码相关

Unicode,到UTF-8。  qp::StringW Global::AnsiToUnicode(const char* buf){ int len = ::MultiByteToWideC...
  • leitianjun
  • leitianjun
  • 2010-05-18 20:53:00
  • 15606

多字节转换MultiByteToWideChar和WideCharToMultiByte使用小结

在学习COM时候看到了字节方面,因为编码有ANSI 还有UNICODE,所以更快学习一下相关的知识。 详细代码见后面,网上资料也很多,总结一下思路: 先计算出转换需要的字节数,把函数其中一个参数设...
  • thdxs
  • thdxs
  • 2013-01-14 15:35:13
  • 5368

Ascii、 unicode、 utf-8 互转(WideCharToMultiByte和MultiByteToWideChar函数的用法)

为了支持Unicode编码,需要多字节与宽字节之间的相互转换。这两个系统函数在使用时需要指定代码页,在实际应用过程中遇到乱码问题,然后重新阅读《Windows核心编程》,总结出正确的用法。 Wide...
  • keebai
  • keebai
  • 2016-01-09 16:49:00
  • 1264

Windows,C/C++_字符串转换_MultiByteToWideChar和WideCharToMultiByte的正确使用方法及参数详解

MultiByteToWideChar和WideCharToMultiByte的正确使用方法及参数详解   本文内容摘自《Windows核心编程》(第五版)Page26。    ...
  • u010003835
  • u010003835
  • 2015-08-12 20:43:11
  • 1049

[转]VC: MultiByteToWideChar和WideCharToMultiByte用法

 //========================================================================//TITLE://    MultiByteTo...
  • xiaofengsheng
  • xiaofengsheng
  • 2009-09-15 17:21:00
  • 2651

char/wchar_t之间的互转MultiByteToWideChar和WideCharToMultiByte的用法

C2W char->wchar_tW2C wchar_t->char注意 codpage参数选择CP_OEMCP这样中文和英文都可以成功转换,如果只要转换英文可以使用CP_ACPbool C2W(co...
  • iamoyjj
  • iamoyjj
  • 2011-05-06 21:25:00
  • 10998

ANIS与UNICODE字符格式转换:MultiByteToWideChar()和WideCharToMultiByte()函数介绍

第一个就是宽字符到多字节字符转换函数,函数原型如下: int WideCharToMultiByte( UINT CodePage, DWORD dwFlags, LPCWSTR lpWid...
  • HolaMirai
  • HolaMirai
  • 2015-08-24 11:33:36
  • 1796
    个人资料
    等级:
    访问量: 1478
    积分: 880
    排名: 6万+
    文章存档