CHTTPFILE::Read()带来的问题

MengBoy 2009-07-10 11:47:59
工程是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;
}
...全文
1052 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
勇往直前之人 2012-06-08
  • 打赏
  • 举报
回复
不错!
changmei 2011-04-14
  • 打赏
  • 举报
回复
supconsupcon的Convert函数很管用,呵呵。
MengBoy 2009-07-11
  • 打赏
  • 举报
回复
我直接用realloc动态分配BYTE数组大小把问题解决了,还是谢谢各位。
supconsupcon 2009-07-11
  • 打赏
  • 举报
回复
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 ;
}
arong1234 2009-07-11
  • 打赏
  • 举报
回复
CString只能包含LPCTSTR的数据,他不懂你所谓的编码。如果你的编码不是T所代表的编码(T在unicode模式下表示unicode文本,否则表示当前线程所对应的代码集的MBCS文本)。
所以如果你读取的文本不是T所对应的当前编码格式,你必须手工转换为这种格式
这不是CString去给你转换了,而是他根本不会懂你那个代码集,自动适应。
xsc2001 2009-07-11
  • 打赏
  • 举报
回复
读取完成以后,再根据编码类型转成Gb2312就行了。
zqlong_sunday 2009-07-11
  • 打赏
  • 举报
回复
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;
bobo_2003 2009-07-10
  • 打赏
  • 举报
回复
帮UP
MengBoy 2009-07-10
  • 打赏
  • 举报
回复
哪位大虾来解答一下呢,谢谢了

3,055

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC HTML/XML
社区管理员
  • HTML/XML社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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