工程是Unicode模式。
网页如果是GB2312,一起正常,返回cstring字符串中文,英文都正常显示。
可是如果网页是UTF8的,就不行了,英文是正常的,中文全乱码。
debug进去看了一下,发现CHtmlView::GetSource()返回的cstring把所有的英文字符转成了Unicode编码(两字节),但是中文字符仍然按照utf8编码存储在内存中。
这种不属于任何一种编码规则的字符串我实在想在想不出怎么用WideCharToMultiByte/MultiByteToWideChar转换。

解决方案 »

  1.   

    怎么会是“不属于任何一种编码规则”。  你都说了是UTF8编码了,一样转,转的API函数我忘了,你查查。
      

  2.   

    你在自己的派生类里面定义一个 GetResource,
    然后把 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;
    }
      

  3.   

    不是GetSource的问题~你再检查一下你使用GetSource得到的CString的地方