当前位置:编程学习 > C/C++ >>

C++:UTF-8与GB2312之间的互换

话不多说,前几天我就遇到了字符之间的麻烦,在网页中出现了乱码,为此我还写了个百度经验,呵呵。

现在就是解决这个问题的时候了,当然用txt自带的“另存为”就可以简单的转换,但是现在讨论的是如何利用c++中的函数来改变的。

下面介绍一下WinAPI的两个函数:WideCharToMultiByte、MultiByteToWideChar。

函数原型:

int WideCharToMultiByte(
 UINT CodePage, // code page
 DWORD dwFlags, // performance and mapping flags
 LPCWSTR lpWideCharStr, // wide-character string
 int cchWideChar, // number of chars in string
 LPSTR lpMultiByteStr, // buffer for new string
 int cbMultiByte, // size of buffer
 LPCSTR lpDefaultChar, // default for unmappable chars
 LPBOOL lpUsedDefaultChar // set when default char used
); //将宽字符转换成多个窄字符

int MultiByteToWideChar(
 UINT CodePage, // code page
 DWORD dwFlags, // character-type options
 LPCSTR lpMultiByteStr, // string to map
 int cbMultiByte, // number of bytes in string
 LPWSTR lpWideCharStr, // wide-character buffer
 int cchWideChar // size of buffer
);//将多个窄字符转换成宽字符
需要用到的一些函数:

CString CTest::HexToBin(CString string)//将16进制数转换成2进制
{
 if( string == "0") return "0000";
 if( string == "1") return "0001";
 if( string == "2") return "0010";
 if( string == "3") return "0011";
 if( string == "4") return "0100";
 if( string == "5") return "0101";
 if( string == "6") return "0110";
 if( string == "7") return "0111";
 if( string == "8") return "1000";
 if( string == "9") return "1001";
 if( string == "a") return "1010";
 if( string == "b") return "1011";
 if( string == "c") return "1100";
 if( string == "d") return "1101";
 if( string == "e") return "1110";
 if( string == "f") return "1111";
 return "";
}

CString CTest::BinToHex(CString BinString)//将2进制数转换成16进制
{
 if( BinString == "0000") return "0";
 if( BinString == "0001") return "1";
 if( BinString == "0010") return "2";
 if( BinString == "0011") return "3";
 if( BinString == "0100") return "4";
 if( BinString == "0101") return "5";
 if( BinString == "0110") return "6";
 if( BinString == "0111") return "7";
 if( BinString == "1000") return "8";
 if( BinString == "1001") return "9";
 if( BinString == "1010") return "a";
 if( BinString == "1011") return "b";
 if( BinString == "1100") return "c";
 if( BinString == "1101") return "d";
 if( BinString == "1110") return "e";
 if( BinString == "1111") return "f";
 return "";
}

int CTest::BinToInt(CString string)//2进制字符数据转换成10进制整型
{
 int len =0;
 int tempInt = 0;
 int strInt = 0;
 for(int i =0 ;i < string.GetLength() ;i ++)
 {
         tempInt = 1;
         strInt = (int)string.GetAt(i)-48;
         for(int k =0 ;k < 7-i ; k++)
         {
   tempInt = 2*tempInt;
         }
         len += tempInt*strInt;
 }
 return len;
}
UTF-8转换成GB2312先把UTF-8转换成Unicode.然后再把Unicode通过函数WideCharToMultiByte转换成GB2312

WCHAR* CTest::UTF_8ToUnicode(char *ustart)  //把UTF-8转换成Unicode
{
 char char_one;
 char char_two;
 char char_three;
 int Hchar;
 int Lchar;
 char uchar[2];
 WCHAR *unicode;
 CString string_one;
 CString string_two;
 CString string_three;
 CString combiString;
 char_one = *ustart;
 char_two = *(ustart+1);
 char_three = *(ustart+2);
 string_one.Format("%x",char_one);
 string_two.Format("%x",char_two);
 string_three.Format("%x",char_three);
 string_three = string_three.Right(2);
 string_two = string_two.Right(2);
 string_one = string_one.Right(2);
 string_three = HexToBin(string_three.Left(1))+HexToBin(string_three.Right(1));
 string_two = HexToBin(string_two.Left(1))+HexToBin(string_two.Right(1));
 string_one = HexToBin(string_one.Left(1))+HexToBin(string_one.Right(1));
 combiString = string_one +string_two +string_three;
 combiString = combiString.Right(20);
 combiString.Delete(4,2);
 combiString.Delete(10,2);
 Hchar = BinToInt(combiString.Left(8));
 Lchar = BinToInt(combiString.Right(8));
 uchar[1] = (char)Hchar;
 uchar[0] = (char)Lchar;
 unicode = (WCHAR *)uchar;
 return unicode;
}

char * CTest::UnicodeToGB2312(unsigned short uData)  //把Unicode 转换成 GB2312
{
 char *buffer ;
 buffer = new char[sizeof(WCHAR)];
 WideCharToMultiByte(CP_ACP,NULL,&uData,1,buffer,sizeof(WCHAR),NULL,NULL);
 return buffer;
}
GB2312转换成UTF-8:先把GB2312通过函数MultiByteToWideChar转换成Unicode.然后再把Unicode通过拆开Unicode后拼装成UTF-8。

作者“李木空间 ”

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,