WideCharToMultiByte和MultiByteToWideChar函式的用法(ascii轉unicode unicode轉ascii)
為了支援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函式和substr函式的用法ASCII函式
- [Python]Unicode轉ascii碼的一個好方法PythonUnicodeASCII
- 字元編碼:ASCII,Unicode和UTF-8字元ASCIIUnicode
- 符號編碼-ASCII、Unicode、Unicode big endian、UTF-8之間的關係(轉)符號ASCIIUnicode
- Jdk用native2ascii命令做unicode編碼轉換JDKASCIIUnicode
- 字元編碼筆記:ASCII,Unicode和UTF-8字元筆記ASCIIUnicode
- 字元編碼筆記:ASCII,Unicode 和 UTF-8字元筆記ASCIIUnicode
- 字元編碼 ASCII,Unicode 和 UTF-8 概念掃盲字元ASCIIUnicode
- Unicode、GBK、UTF-8、ASCII的編碼簡介UnicodeASCII
- oracle中的chr()和ascii()函式OracleASCII函式
- js 字母和ASCII的轉換JSASCII
- 字元編解碼的故事(ASCII,ANSI,Unicode,Utf-8區別)字元ASCIIUnicode
- javascript 字元轉換為ascii碼,ascii碼轉換為字元JavaScript字元ASCII
- Delphi 中big5 轉 Unicode 函式Unicode函式
- javascript字串和ascii碼的相互轉換JavaScript字串ASCII
- oracle中ascii函式及to_char函式使用及編碼間的轉換OracleASCII函式
- 一文講透Windows平臺下的ASCII,Unicode編碼問題WindowsASCIIUnicode
- VB中的Unicode 和 Ansi 格式 (轉)Unicode
- Java Unicode互轉JavaUnicode
- ascii碼與字元的相互轉換ASCII字元
- unicode轉碼工具類Unicode
- UNICODE碼轉漢字Unicode
- 【轉】utf-8與Unicode的轉化Unicode
- C++ string互轉wstring/Unicode互轉ANSI/Unicode互轉UTF8C++Unicode
- WindowsCE下Unicode和Ansi字元間互相轉換的例子 (轉)WindowsUnicode字元
- python實現中文和unicode轉換PythonUnicode
- 一張圖理清計算機常見編碼的關係。ASCII、Unicode都不是事兒計算機ASCIIUnicode
- ASCII,Unicode,UTF-8,GB2312一些關於編碼的理解ASCIIUnicode
- UTF-8 and Unicode FAQ(轉)Unicode
- 字串: 怎樣在ANSI 和 UNICODE間做轉換 (轉)字串Unicode
- scanf()函式的用法和實踐 (轉)函式
- ascii2native 轉碼 解碼ASCII
- 從 unicode 到位元組的轉換Unicode
- Unicode編碼和中文互轉(JAVA實現)UnicodeJava
- iOS Unicode轉中文(UTF-8)iOSUnicode
- 在 VB 中使用 Unicode API (轉)UnicodeAPI
- CSS文字:unicode-bidi(轉)CSSUnicode
- Linux Unicode 程式設計(轉)LinuxUnicode程式設計