工程是Unicode模式。
网页如果是GB2312,一起正常,返回cstring字符串中文,英文都正常显示。
可是如果网页是UTF8的,就不行了,英文是正常的,中文全乱码。
debug进去看了一下,发现CHtmlView::GetSource()返回的cstring把所有的英文字符转成了Unicode编码(两字节),但是中文字符仍然按照utf8编码存储在内存中。
这种不属于任何一种编码规则的字符串我实在想在想不出怎么用WideCharToMultiByte/MultiByteToWideChar转换。
网页如果是GB2312,一起正常,返回cstring字符串中文,英文都正常显示。
可是如果网页是UTF8的,就不行了,英文是正常的,中文全乱码。
debug进去看了一下,发现CHtmlView::GetSource()返回的cstring把所有的英文字符转成了Unicode编码(两字节),但是中文字符仍然按照utf8编码存储在内存中。
这种不属于任何一种编码规则的字符串我实在想在想不出怎么用WideCharToMultiByte/MultiByteToWideChar转换。
解决方案 »
- 新手请教两个问题
- 为什么使用.manifest文件加载XP主题后工具栏左角无法正常刷新???
- 如何关闭其他进程的句柄?
- 请问如何虚拟一个文件夹或驱动器
- 有什么方法把接口指针转换为相应的类指针
- 如何用一台主机控制俩个显示器?在俩个显示器显示不一样的界面?
- *********<<windows 程序设计>>上的源程序,编译通不过.怎么改??????(急!waiting...........)********************
- 关于存储视图窗口显示的图象内容的问题.谢谢.
- 请大侠帮忙看一下!!
- 关于CObject的AssertValid函数
- 通过socket传递数组问题
- VC2005 CCOMBOX的问题
然后把 CHtmlView::GetResource 代码拷出来
然后改一下就行了BOOL CyourHtmlView::GetSource(CString& refString)
{
ENSURE(m_pBrowserApp != NULL); BOOL bRetVal = FALSE;
CComPtr<IDispatch> spDisp;
m_pBrowserApp->get_Document(&spDisp);
if (spDisp != NULL)
{
HGLOBAL hMemory;
hMemory = GlobalAlloc(GMEM_MOVEABLE, 0);
if (hMemory != NULL)
{
CComQIPtr<IPersistStreamInit> spPersistStream = spDisp;
if (spPersistStream != NULL)
{
CComPtr<IStream> spStream;
if (SUCCEEDED(CreateStreamOnHGlobal(hMemory, TRUE, &spStream)))
{
spPersistStream->Save(spStream, FALSE); LPCSTR pstr = static_cast<LPCSTR>(GlobalLock(hMemory));
if (pstr != NULL)
{
// Stream is always ANSI, but CString
// assignment operator will convert implicitly. bRetVal = TRUE;
TRY
{
refString = pstr; 自己转一下码 }
CATCH_ALL(e)
{
bRetVal = FALSE;
DELETE_EXCEPTION(e);
}
END_CATCH_ALL if(bRetVal == FALSE)
GlobalFree(hMemory);
else
GlobalUnlock(hMemory);
}
else
{
GlobalFree(hMemory);
}
}
else
{
GlobalFree(hMemory);
}
}
else
{
GlobalFree(hMemory);
}
}
}
return bRetVal;
}