UTF-8转GB2312,BIG5转GB2312问题,有会的帮忙下。

tonytao 2006-03-03 09:48:42
最近在研究VC时,碰到了编码问题,UTF8数据在存储时总是显示乱码,现希望对这些数据进行编码转换,请问大虾们如何将UTF-8转换成GB2312,最好有源码。。谢谢了。。
...全文
450 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
cutegang 2006-03-19
  • 打赏
  • 举报
回复
上面那篇文章是vckbase上的一位朋友写的吧。感觉不是很好用。不会用呀。
倒是对二楼那位朋友的转换表非常赶兴趣,
但是问题如下:
写出gb2312的所有字符为一个txt文件,如gb2312.txt
this item似乎有点难做,该如何进行?
seahust 2006-03-19
  • 打赏
  • 举报
回复
给你代码,我用的:
CString SktHttp::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 SktHttp::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 SktHttp::BinToInt(char *pBin)
{
int m_Dec = 0;
int m_Len = strlen(pBin);

for (int i =0 ;i < m_Len ;i ++)
{
m_Dec = (m_Dec << 1) + (pBin[i] - '0');
}

return m_Dec;

}

// UTF-8转换成GB2312先把UTF-8转换成Unicode.然后再把Unicode通过函数WideCharToMultiByte转换成GB2312
WCHAR* SktHttp::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);
char tmpchar[256];
strcpy(tmpchar,combiString.Left(8));
Hchar = BinToInt(tmpchar);
strcpy(tmpchar,combiString.Right(8));
Lchar = BinToInt(tmpchar);
uchar[1] = (char)Hchar;
uchar[0] = (char)Lchar;
unicode = (WCHAR *)uchar;
return unicode;
}

char *SktHttp::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。

WCHAR * SktHttp::Gb2312ToUnicode(char *gbBuffer) //GB2312 转换成 Unicode
{
WCHAR *uniChar;
uniChar = new WCHAR[1];
::MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,gbBuffer,2,uniChar,1);
return uniChar;
}


char * SktHttp::UnicodeToUTF_8(WCHAR *UniChar) // Unicode 转换成UTF-8
{
char *buffer,tmpchar[100];

CString strOne;
CString strTwo;
CString strThree;
CString strFour;
CString strAnd;
buffer = new char[3];
int hInt,lInt;
hInt = (int)((*UniChar)/256);
lInt = (*UniChar)%256;
CString string ;
string.Format("%x",hInt);
strTwo = HexToBin(string.Right(1));
string = string.Left(string.GetLength() - 1);
strOne = HexToBin(string.Right(1));
string.Format("%x",lInt);
strFour = HexToBin(string.Right(1));
string = string.Left(string.GetLength() -1);
strThree = HexToBin(string.Right(1));
strAnd = strOne +strTwo + strThree + strFour;
strAnd.Insert(0,"1110");
strAnd.Insert(8,"10");
strAnd.Insert(16,"10");
strOne = strAnd.Left(8);
strAnd = strAnd.Right(16);
strTwo = strAnd.Left(8);
strThree = strAnd.Right(8);

strcpy(tmpchar,strOne);
*buffer = (char)BinToInt(tmpchar);
strcpy(tmpchar,strTwo);
buffer[1] = (char)BinToInt(tmpchar);
strcpy(tmpchar,strThree);
buffer[2] = (char)BinToInt(tmpchar);
return buffer;
}

char * SktHttp::TranslateUTF_8ToGB(char *xmlStream, int len) //len 是xmlStream的长度
{
char * newCharBuffer = new char[len];
int index =0;
int nCBIndex = 0;

while(index < len)
{
if(xmlStream[index] > 0) // 如果是GB2312的字符
{
newCharBuffer[nCBIndex] = xmlStream[index]; //直接复制
index += 1; //源字符串偏移量1
nCBIndex += 1; //目标字符串偏移量1
}
else //如果是UTF-8的字符
{
WCHAR * Wtemp = this->UTF_8ToUnicode(xmlStream + index); //先把UTF-8转成Unicode
char * Ctemp = this->UnicodeToGB2312(*Wtemp);//再把Unicode 转成 GB2312
newCharBuffer[nCBIndex] = * Ctemp; // 复制
newCharBuffer[nCBIndex + 1] = *(Ctemp + 1);
index += 3; //源字符串偏移量3
nCBIndex += 2; //目标字符串偏移量2 因为一个中文UTF-8占3个字节,GB2312占两个字节
}
}
newCharBuffer[nCBIndex] = 0; //结束符

return newCharBuffer;
}

void SktHttp::ChangeUTF8_To_GB(LPCSTR srcFileName,LPCSTR targetFileName)
{
// TODO: Add your control notification handler code here
char *pSrc,*pTarget;
int len;


CFile f;
if (f.Open(srcFileName,CFile::modeRead))
{
len = f.GetLength();

pSrc = (char *)malloc(len);
pTarget = (char *)malloc(len);

f.Read(pSrc,len);

strcpy(pTarget ,TranslateUTF_8ToGB(pSrc, len));
f.Close();

free(pSrc);
}

if (f.Open(targetFileName,CFile::modeCreate | CFile::modeWrite))
{
f.Write(pTarget,len);
f.Close();
free(pTarget);
}

}
striking 2006-03-03
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=212253
Interwetten 2006-03-03
  • 打赏
  • 举报
回复
步骤:
1。写出gb2312的所有字符为一个txt文件,如gb2312.txt
2。用工具把此字符表转换成utf8文件,即utf8编码的 utf8.txt
3。根据这两个文件作出gb2312码和utf8码的转换表
4。根据码表进行转换。
其中最重要的就是步骤3,做出这个码表来就ok了。
自己做也很简单,如果时间紧,你到网上找找看,应该有现成的可以用

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧