CHttpFile Read(
场景:CHTTPFILE:Read()带来的有关问题
CHTTPFILE::Read()带来的问题
工程是Unicode模式,用CHttpFile::Read()来从某网站读取网页数据(UTF8编码)
如果用以下语句,虽然myData取得了正确的UTF8编码数据流,
但是当赋值给cstring类型以后,系统会自行转码,造成网页中文乱码,
并且由于这里是每1024个字节为一组读取数据,这就造成有些中文的UTF8码被截成了前后两次,
分别传入myData数组,这也是一个造成乱码的环节,
现在我想问的是各位有没有好的办法,
先以网页原始编码提取完整的网页数据(不能自动转码),然后对整个数据统一转码,谢谢了,这个问题困扰我很久了
BYTE myData[1024] = {0};
CString szrec;
while ( pMyHttpFile->Read ( (void *)myData,sizeof(myData) ) > 0){
szrec += myData;
}
------解决方案--------------------
char strBuff[1025] = {0};
string strHtml; //是string 不是CString
while ((htmlFile->Read((void*)strBuff, 1024)) > 0)
{
strHtml += strBuff;
}
// _cprintf("\n读取内容结束...");
int unicodeLen = MultiByteToWideChar(CP_UTF8, 0, strHtml.c_str(), -1, NULL, 0);
WCHAR *pUnicode = new WCHAR[unicodeLen + 1];
memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));
MultiByteToWideChar(CP_UTF8,0,strHtml.c_str(),-1, pUnicode,unicodeLen);
CString str(pUnicode); //这就是要的内容
delete []pUnicode;
------解决方案--------------------
CString szrec;
while ( pMyHttpFile->Read ( (void *)myData,sizeof(myData) ) > 0){
szrec += myData;
}
1 建议不要用while循环,用do while,这样的问题我碰到过,Read和ReadString函数有时会返回0,但是myData却不为空,建议按如下代码来读文件:
CString strData;
m_pMyHttpFile->ReadString(strData);
do
{
strInfo += strData;
} while (m_ptrHttpFile->ReadString(strData));
// 编码转换
CString strRe;
Convert(strInfo, strRe, CP_UTF8,936);
2 如果你的网站都是UTF-8编码的话,在循环读取文件后,进行一次UTF-8的转换就可以了,给你一个转换函数
// 编码转换
void CXX::Convert(CString& strSrc, CString& strRe, int sourceCodepage, int targetCodepage)
{
// 获取待转换的字符串的字节数
int len=strSrc.GetLength();
// 获取转换后的字节数
int unicodeLen=MultiByteToWideChar(sourceCodepage,0,strSrc,-1,NULL,0);
wchar_t * pUnicode;
pUnicode=new wchar_t[unicodeLen+1];
memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));
MultiByteToWideChar(sourceCodepage,0,strSrc,-1,(LPWSTR)pUnicode,unicodeLen);
BYTE* pTargetData = NULL;
int targetLen = 0;
targetLen = WideCharToMultiByte(targetCodepage,0,(LPWSTR)pUnicode,-1,(char*)pTargetData,0,NULL,NULL);
pTargetData=new BYTE[targetLen+1];
memset(pTargetData,0,targetLen+1);
WideCharToMultiByte(targetCodepage,0,(LPWSTR)pUnicode,-1,(char*)pTargetData,targetLen,NULL,NULL);
strRe.Format("%s",pTargetData);
delete[] pUnicode;
delete[] pTargetData;
return ;
}
CHTTPFILE::Read()带来的问题
工程是Unicode模式,用CHttpFile::Read()来从某网站读取网页数据(UTF8编码)
如果用以下语句,虽然myData取得了正确的UTF8编码数据流,
但是当赋值给cstring类型以后,系统会自行转码,造成网页中文乱码,
并且由于这里是每1024个字节为一组读取数据,这就造成有些中文的UTF8码被截成了前后两次,
分别传入myData数组,这也是一个造成乱码的环节,
现在我想问的是各位有没有好的办法,
先以网页原始编码提取完整的网页数据(不能自动转码),然后对整个数据统一转码,谢谢了,这个问题困扰我很久了
BYTE myData[1024] = {0};
CString szrec;
while ( pMyHttpFile->Read ( (void *)myData,sizeof(myData) ) > 0){
szrec += myData;
}
------解决方案--------------------
char strBuff[1025] = {0};
string strHtml; //是string 不是CString
while ((htmlFile->Read((void*)strBuff, 1024)) > 0)
{
strHtml += strBuff;
}
// _cprintf("\n读取内容结束...");
int unicodeLen = MultiByteToWideChar(CP_UTF8, 0, strHtml.c_str(), -1, NULL, 0);
WCHAR *pUnicode = new WCHAR[unicodeLen + 1];
memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));
MultiByteToWideChar(CP_UTF8,0,strHtml.c_str(),-1, pUnicode,unicodeLen);
CString str(pUnicode); //这就是要的内容
delete []pUnicode;
------解决方案--------------------
CString szrec;
while ( pMyHttpFile->Read ( (void *)myData,sizeof(myData) ) > 0){
szrec += myData;
}
1 建议不要用while循环,用do while,这样的问题我碰到过,Read和ReadString函数有时会返回0,但是myData却不为空,建议按如下代码来读文件:
CString strData;
m_pMyHttpFile->ReadString(strData);
do
{
strInfo += strData;
} while (m_ptrHttpFile->ReadString(strData));
// 编码转换
CString strRe;
Convert(strInfo, strRe, CP_UTF8,936);
2 如果你的网站都是UTF-8编码的话,在循环读取文件后,进行一次UTF-8的转换就可以了,给你一个转换函数
// 编码转换
void CXX::Convert(CString& strSrc, CString& strRe, int sourceCodepage, int targetCodepage)
{
// 获取待转换的字符串的字节数
int len=strSrc.GetLength();
// 获取转换后的字节数
int unicodeLen=MultiByteToWideChar(sourceCodepage,0,strSrc,-1,NULL,0);
wchar_t * pUnicode;
pUnicode=new wchar_t[unicodeLen+1];
memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));
MultiByteToWideChar(sourceCodepage,0,strSrc,-1,(LPWSTR)pUnicode,unicodeLen);
BYTE* pTargetData = NULL;
int targetLen = 0;
targetLen = WideCharToMultiByte(targetCodepage,0,(LPWSTR)pUnicode,-1,(char*)pTargetData,0,NULL,NULL);
pTargetData=new BYTE[targetLen+1];
memset(pTargetData,0,targetLen+1);
WideCharToMultiByte(targetCodepage,0,(LPWSTR)pUnicode,-1,(char*)pTargetData,targetLen,NULL,NULL);
strRe.Format("%s",pTargetData);
delete[] pUnicode;
delete[] pTargetData;
return ;
}