簡體   English   中英

如何在我的C#代碼中正確處理Web響應中的UTF-8?

[英]How do I correctly deal with UTF-8 in web responses in my C# code?

為了序言,我從Joel Spolsky的文章中學到了最多關於文本編碼的知識。

我目前正在編寫一個C#網絡系統,以便在我們的Google Search設備上執行查詢,閱讀結果並在我們自己的自定義用戶界面中將其呈現給用戶。 但是,當我向用戶顯示文本摘要時,存在編碼問題。

當我直接在chrome / IE /中查詢GSA時,我得到以下響應

賽后筆記沒有 8號種子DePaul vs. No。 9號種子 USF第6場比賽 - 第二場
回合

在我的C#代碼中,我正在使用以下代碼閱讀該響應:

        var request = WebRequest.Create(LastQueryUrl);
        var response = (HttpWebResponse)request.GetResponse();

        if (response.StatusCode != HttpStatusCode.OK)
            return null;

        using (var reader = new StreamReader(response.GetResponseStream(), System.Text.Encoding.UTF8))
            content = reader.ReadToEnd();

當我調試content變量時,我看到該字符串轉換為:

南佛羅里達大學第6場比賽 秒

我99%肯定來自GSA的數據是UTF-8格式,因為他們的xml上的其他點,以及文檔中的各種花絮。 即使如果我使用System.Text.Encoding.Unicode讀取流,也沒有任何文本是可讀的。

我做錯了什么,如何才能正確顯示文字?


編輯:使用System.Text.Encoding.GetEncoding("ISO-8859-1")給我

南佛羅里達大學6場比賽

沒有問號,雖然破折號沒有出現。

您可以嘗試執行此代碼(而不是using塊)並再次粘貼結果嗎? 我假設你使用的是.NET 4。

using (var responseStream = response.GetResponseStream())
using (var memoryStream = new MemoryStream())
{
    responseStream.CopyTo(memoryStream);
    byte[] bytes = memoryStream.ToArray();
    content = BitConverter.ToString(bytes);
}

編輯 :我注意到你沒有粘貼帖子中的整個返回字符串。 是因為字符串的其余部分包含機密數據嗎? 如果是這樣,請不要粘貼上面建議的結果。

編輯2 :要正確渲染結果,可以使用Encoding.GetEncoding(1252) ; 但是,我建議你不要那樣做,原因我很快就會解釋。

說明 :從我的想法來看,你的問題似乎是發送方的編碼錯誤。 你說他們的文檔聲稱UTF-8,這顯然與他們的ISO-8859-1的XML聲明相矛盾。 實際上,使用的編碼都不是兩者之一。

在您上傳的十六進制字符串中,罪魁禍首字符的字節值為0x96 ,發生在序列20-96-20的中間。 在UTF-8和ISO-8859-1(以及它們之前的ASCII)中, 0x20是空格字符。 然而,在UTF-8 , 0x96是延續字節,並且是無效的 ,除非其前面一個起始字節(其0x20是不是)。 ISO-8859-1中0x96是C1控制字符,因此不是可打印字符(不能向用戶顯示)。

因此,我們可以推斷原始字符編碼既不是UTF-8也不是ISO-8859-1,而是Windows-1252 ,有時被認為是ISO-8859-1的“超集”,因為它取代了0x80 - 0x9F控制字符范圍通過可顯示的字符。 實際上,在Windows-1252中, 0x96是您期望的短划線字符。

考慮到上述情況,通過假設Windows-1252編碼來解決您的問題可能是安全的; 但是,如果我是你,我會聯系提供者並告知他們這個缺陷。

using (var stream = response.GetResponseStream())
using (var reader = new StreamReader(stream, System.Text.Encoding.GetEncoding(1252)))
   content = reader.ReadToEnd();

HTML5規范要求宣傳為ISO-8859-1文檔實際上是使用Windows-1252編碼進行解析的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM