WideCharToMultiByte和MultiByteToWideChar函数的用法(ascii转unicode unicode转ascii)
2013-06-07 09:36
302 查看
为了支持Unicode编码,需要多字节与宽字节之间的相互转换。这两个系统函数在使用时需要指定代码页,在实际应用过程中遇到乱码问题,然后重新阅读《Windows核心编程》,总结出正确的用法。
WideCharToMultiByte的代码页用来标记与新转换的字符串相关的代码页。
MultiByteToWideChar的代码页用来标记与一个多字节字符串相关的代码页。
常用的代码页由CP_ACP和CP_UTF8两个。
使用CP_ACP代码页就实现了ANSI与Unicode之间的转换。
使用CP_UTF8代码页就实现了UTF-8与Unicode之间的转换。
下面是代码实现:
1. ANSI to Unicode
wstring ANSIToUnicode( const string& str )
{
int len = 0;
len = str.length();
int unicodeLen = ::MultiByteToWideChar( CP_ACP,
0,
str.c_str(),
-1,
NULL,
0 );
wchar_t * pUnicode;
pUnicode = new wchar_t[unicodeLen+1];
memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));
::MultiByteToWideChar( CP_ACP,
0,
str.c_str(),
-1,
(LPWSTR)pUnicode,
unicodeLen );
wstring rt;
rt = ( wchar_t* )pUnicode;
delete pUnicode;
return rt;
}
2. Unicode to ANSI
string UnicodeToANSI( const wstring& str )
{
char* pElementText;
int iTextLen;
// wide char to multi char
iTextLen = WideCharToMultiByte( CP_ACP,
0,
str.c_str(),
-1,
NULL,
0,
NULL,
NULL );
pElementText = new char[iTextLen + 1];
memset( ( void* )pElementText, 0, sizeof( char ) * ( iTextLen + 1 ) );
::WideCharToMultiByte( CP_ACP,
0,
str.c_str(),
-1,
pElementText,
iTextLen,
NULL,
NULL );
string strText;
strText = pElementText;
delete[] pElementText;
return strText;
}
3. UTF-8 to Unicode
wstring UTF8ToUnicode( const string& str )
{
int len = 0;
len = str.length();
int unicodeLen = ::MultiByteToWideChar( CP_UTF8,
0,
str.c_str(),
-1,
NULL,
0 );
wchar_t * pUnicode;
pUnicode = new wchar_t[unicodeLen+1];
memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));
::MultiByteToWideChar( CP_UTF8,
0,
str.c_str(),
-1,
(LPWSTR)pUnicode,
unicodeLen );
wstring rt;
rt = ( wchar_t* )pUnicode;
delete pUnicode;
return rt;
}
4. Unicode to UTF-8
string UnicodeToUTF8( const wstring& str )
{
char* pElementText;
int iTextLen;
// wide char to multi char
iTextLen = WideCharToMultiByte( CP_UTF8,
0,
str.c_str(),
-1,
NULL,
0,
NULL,
NULL );
pElementText = new char[iTextLen + 1];
memset( ( void* )pElementText, 0, sizeof( char ) * ( iTextLen + 1 ) );
::WideCharToMultiByte( CP_UTF8,
0,
str.c_str(),
-1,
pElementText,
iTextLen,
NULL,
NULL );
string strText;
strText = pElementText;
delete[] pElementText;
return strText;
}
====================================================================
转换代码:
WideCharToMultiByte的代码页用来标记与新转换的字符串相关的代码页。
MultiByteToWideChar的代码页用来标记与一个多字节字符串相关的代码页。
常用的代码页由CP_ACP和CP_UTF8两个。
使用CP_ACP代码页就实现了ANSI与Unicode之间的转换。
使用CP_UTF8代码页就实现了UTF-8与Unicode之间的转换。
下面是代码实现:
1. ANSI to Unicode
wstring ANSIToUnicode( const string& str )
{
int len = 0;
len = str.length();
int unicodeLen = ::MultiByteToWideChar( CP_ACP,
0,
str.c_str(),
-1,
NULL,
0 );
wchar_t * pUnicode;
pUnicode = new wchar_t[unicodeLen+1];
memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));
::MultiByteToWideChar( CP_ACP,
0,
str.c_str(),
-1,
(LPWSTR)pUnicode,
unicodeLen );
wstring rt;
rt = ( wchar_t* )pUnicode;
delete pUnicode;
return rt;
}
2. Unicode to ANSI
string UnicodeToANSI( const wstring& str )
{
char* pElementText;
int iTextLen;
// wide char to multi char
iTextLen = WideCharToMultiByte( CP_ACP,
0,
str.c_str(),
-1,
NULL,
0,
NULL,
NULL );
pElementText = new char[iTextLen + 1];
memset( ( void* )pElementText, 0, sizeof( char ) * ( iTextLen + 1 ) );
::WideCharToMultiByte( CP_ACP,
0,
str.c_str(),
-1,
pElementText,
iTextLen,
NULL,
NULL );
string strText;
strText = pElementText;
delete[] pElementText;
return strText;
}
3. UTF-8 to Unicode
wstring UTF8ToUnicode( const string& str )
{
int len = 0;
len = str.length();
int unicodeLen = ::MultiByteToWideChar( CP_UTF8,
0,
str.c_str(),
-1,
NULL,
0 );
wchar_t * pUnicode;
pUnicode = new wchar_t[unicodeLen+1];
memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));
::MultiByteToWideChar( CP_UTF8,
0,
str.c_str(),
-1,
(LPWSTR)pUnicode,
unicodeLen );
wstring rt;
rt = ( wchar_t* )pUnicode;
delete pUnicode;
return rt;
}
4. Unicode to UTF-8
string UnicodeToUTF8( const wstring& str )
{
char* pElementText;
int iTextLen;
// wide char to multi char
iTextLen = WideCharToMultiByte( CP_UTF8,
0,
str.c_str(),
-1,
NULL,
0,
NULL,
NULL );
pElementText = new char[iTextLen + 1];
memset( ( void* )pElementText, 0, sizeof( char ) * ( iTextLen + 1 ) );
::WideCharToMultiByte( CP_UTF8,
0,
str.c_str(),
-1,
pElementText,
iTextLen,
NULL,
NULL );
string strText;
strText = pElementText;
delete[] pElementText;
return strText;
}
====================================================================
转换代码:
//Uniocde 和 ASCII 的转换 bFlg==TRUE:UNICODE->ASCII FLASE:ASCII->UNICODE //bIsAlloc为自动申请内存/手动申请内存 如果是自动模式需要调用者自己释放 如HeapFree(GetProcessHeap(), 0, pcName); 手动模式则是创建者自己释放 void Unicode2Ascii(PWCHAR *pwStr, PCHAR *pcStr, BOOL bFlg, BOOL bIsAlloc=TRUE) { int nSizeW, nSizeC; //UNICODE 转 ASCII if(bFlg) { nSizeW=wcslen(*pwStr); nSizeC=WideCharToMultiByte(CP_ACP, 0, *pwStr, nSizeW, NULL, 0, NULL, NULL); //自动申请内存 if(bIsAlloc) { *pcStr = (CHAR*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (nSizeC + 1) * sizeof(CHAR)); } //手动申请内存 else { memset(*pcStr, 0, (nSizeC + 1) * sizeof(CHAR)); } WideCharToMultiByte(CP_ACP, 0, *pwStr, nSizeW, *pcStr, nSizeC * sizeof(CHAR), NULL, NULL); } //ASCII 转 UNICODE else { nSizeC=MultiByteToWideChar(CP_ACP, 0, *pcStr, -1, NULL, 0); if(bIsAlloc) { *pwStr= (PWCHAR)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (nSizeC+1) * sizeof(WCHAR)); } else { memset(*pwStr, 0, (nSizeC+1) * sizeof(WCHAR)); } MultiByteToWideChar(CP_ACP, 0, *pcStr, -1, *pwStr, nSizeC * sizeof(WCHAR)); } }
相关文章推荐
- Ascii、 unicode、 utf-8 互转(WideCharToMultiByte和MultiByteToWideChar函数的用法)
- Unicode UTF-8 Ansi 互转及MultiByteToWideChar和WideCharToMultiByte用法等编码相关
- MultiByteToWideChar和WideCharToMultiByte用法详解, ANSI和UNICODE之间的转换
- MultiByteToWideChar和WideCharToMultiByte用法详解
- WideCharToMultiByte和MultiByteToWideChar函数的用法
- MultiByteToWideChar和WideCharToMultiByte用法详解
- WideCharToMultiByte和MultiByteToWideChar函数的用法
- MultiByteToWideChar和WideCharToMultiByte用法详解
- MultiByteToWideChar和WideCharToMultiByte用法详解
- MultiByteToWideChar和WideCharToMultiByte用法详解 (转自 酱坛子)
- WideCharToMultiByte的具体用法(wchar_t转LPCSTR之类的)
- MultiByteToWideChar和WideCharToMultiByte用法详解
- WideCharToMultiByte和MultiByteToWideChar函数的用法
- WideCharToMultiByte和MultiByteToWideChar函数的用法
- MultiByteToWideChar和WideCharToMultiByte用法详解
- MultiByteToWideChar和WideCharToMultiByte用法详解
- WideCharToMultiByte和MultiByteToWideChar函数的用法
- MultiByteToWideChar和WideCharToMultiByte用法详解
- MultiByteToWideChar和WideCharToMultiByte用法详解
- WideCharToMultiByte和MultiByteToWideChar函数的用法