您的位置:首页 > 其它

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;

}

====================================================================

转换代码:

//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));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: