用HttpWebResponse获取到网页源码后,有的是GB2312,有的是UTF-8,还有其它的编码,如果网页是UTF-8,在下载网页时用GB2312解码后的源码中文是乱码,请问在下载网页源码后怎么获得网页的相应编码进行解码?问题很急,请大虾们帮帮忙,谢谢。

解决方案 »

  1.   

    统一用GB2312编码不行,如果网页是用UTF-8编码的,用GB2312解码后的源码中文是乱码
      

  2.   

    IMultiLanguage2::DetectCodepageInIStream
      

  3.   

    DetectCodepageInIStream怎么用啊,给个例子吧,谢谢。
      

  4.   

    先统一编为ASCII,再转gb2312,IO用流.
      

  5.   

    ascii好像不支持中文字符的吧
    我也试过了,把接收到的数据流转为ASCII后再转为GB2312,不管网页是什么编码的,中文还是乱码呀
    CharacterSet和ContentEncoding属性为什么都返回空字符串,NET中就没有一种统一的方法去自适应网页编码吗?
      

  6.   

    随便弄个编码,先看看里面的 meta中的 charset是什么
    IE浏览器应该也是基于 charset来确定编码的
      

  7.   

    然后再根据那个编码来读取 stream
      

  8.   

    我知道可以用这种charset方法来转换网页编码,但是并不是所有的网页都会有charset,所以这个方法只能解决部分网页。
      

  9.   

    http头中带网页编码的网站很少,这个我都看过的。
    比较新的服务器系统才可能会给,这个方法不用想了。XMLDocument.load好像可以自动辨别编码,但是我找了很久没有找到他是怎么做的。对于页面中没有charset的,IE也会显示错啊,只有用户自己选择编码才可以。
    可见微软都没有解决好这个问题。
      

  10.   

    IE可以正常显示啊,不管HTTP头有没有带网页编码或页面里有没有charset,IE都能自适应的显示编码为gb2312、utf8等等几种编码的网页,但是在NET里怎么样可以做到呢?
      

  11.   

    参考
    http://community.csdn.net/Expert/TopicView3.asp?id=5169830
      

  12.   

    下面的源码是由一个叫jiangsheng的朋友提供,在此先谢谢他,但是我不会用C#,还请大家帮忙把下面的源码转换成VB.net的,谢谢。static HRESULT DetectCodePage(
            IStreamPtr spStream,
            std::vector<DWORD>& dwCodePages,
            DWORD dwFlag = MLDETECTCP_8BIT,
            DWORD dwPrefWinCodePage = 0)
        {
            HRESULT hr = S_OK;        const int N = 32;                    
            INT nScores = N;
            DetectEncodingInfo info[N];
            hr = DetectCodepageInIStream(
                dwFlag,
                dwPrefWinCodePage,
                spStream,
                info,
                &nScores);
            if (FAILED(hr))
            {
                return hr;
            }        for (int i = 0; i < nScores; i++)
            {
                dwCodePages.push_back(info[i].nCodePage);
            }        return S_OK;
        }    // IE5.0 or lator
        static HRESULT DetectCodepageInIStream(
            DWORD dwFlag,
            DWORD dwPrefWinCodePage,
            IStream *pstmIn,
            DetectEncodingInfo *lpEncoding,
            INT *pnScores)
        {
            HRESULT hr = S_OK;        try
            {
                IMultiLanguage2Ptr spMultiLanguage2 = GetMultiLanguage();
                if (spMultiLanguage2 == NULL)
                {
                    return E_FAIL;
                }            hr = spMultiLanguage2->DetectCodepageInIStream(
                    dwFlag,
                    dwPrefWinCodePage,
                    pstmIn,
                    lpEncoding,
                    pnScores);
                if (FAILED(hr))
                {
                    return hr;
                }
            }
            catch (...)
            {
                return E_FAIL;
            }        return S_OK;
        }    static IMultiLanguagePtr GetMultiLanguage()
        {
            HRESULT hr = S_OK;        IMultiLanguagePtr spMultiLanguage;
            hr = spMultiLanguage.CreateInstance(__uuidof(CMultiLanguage));
            if (FAILED(hr))
            {
                return NULL;
            }        return spMultiLanguage;
        }
      

  13.   

    哈 你遇到强人了
    我拿去用了哈谢谢楼主 谢谢 蒋晟.Net
    不过我也不会 vb.net
      

  14.   

    问题很急,因这个问题项目都暂停开发了,请会的朋友帮忙转换一下为VB.net的源代码,小弟在先谢谢了。
      

  15.   


    Shared Property DetectCodePage(() As HRESULT
    End Property
            IStreamPtr spStream,
            std::vector<DWORD>& dwCodePages,        DWORD dwFlag = MLDETECTCP_8BIT,
            DWORD dwPrefWinCodePage Function 0)() As =
            Dim hr As HRESULT =  S_OK 
     
            const Integer N = 32                    
            Dim nScores As INT =  N 
            Dim info(N) As DetectEncodingInfo
            hr = DetectCodepageInIStream(
                dwFlag,
                dwPrefWinCodePage,
                spStream,
                info,
                &nScores)
            If FAILED(hr) Then
                Return hr
            End If
     
            Dim i As Integer
            For  i = 0 To  nScores- 1  Step  i + 1
                dwCodePages.push_back(info(i).nCodePage)
            Next
     
            Return S_OK
            End Function
     
        ' IE5.0 or lator
        Shared Property DetectCodepageInIStream(() As HRESULT
        End Property
            DWORD dwFlag,
            DWORD dwPrefWinCodePage,
            IStream *pstmIn,
            DetectEncodingInfo *lpEncoding,
            Private Function *pnScores)() As INT
            Dim hr As HRESULT =  S_OK 
     
            Try
                Dim spMultiLanguage2 As IMultiLanguage2Ptr =  GetMultiLanguage() 
                If spMultiLanguage2 = NULL Then
                    Return E_FAIL
                End If
     
                hr = spMultiLanguage2->DetectCodepageInIStream(
                    dwFlag,
                    dwPrefWinCodePage,
                    pstmIn,
                    lpEncoding,
                    pnScores)
                If FAILED(hr) Then
                    Return hr
                End If
            Catch
                Return E_FAIL
            End Try
     
            Return S_OK
            End Function
     
        Shared Function GetMultiLanguage() As IMultiLanguagePtr
            Dim hr As HRESULT =  S_OK 
     
            Dim spMultiLanguage As IMultiLanguagePtr
            hr = spMultiLanguage.CreateInstance(__uuidof(CMultiLanguage))
            If FAILED(hr) Then
                Return NULL
            End If
     
            Return spMultiLanguage
        End Function