кодировка при получении страницы из сети - PullRequest
2 голосов
/ 27 декабря 2011

Мне нужно загрузить веб-страницу, у меня есть следующий код, чтобы определить кодировку

                System.IO.StreamReader sr=null;

                mFrm.InfoShotcut("Henter webside....");
                if(response.ContentEncoding!=null && response.ContentEncoding!="")
                {
                    sr=new System.IO.StreamReader(srm,System.Text.Encoding.GetEncoding(response.ContentEncoding));
                }
                else
                {
                    //System.Windows.Forms.MessageBox.Show();
                    sr=new  System.IO.StreamReader(srm,System.Text.Encoding.GetEncoding(response.CharacterSet));
                }

                if(sr!=null)
                {
                    result=sr.ReadToEnd();

                     if(response.CharacterSet!=GetCharatset(result))
                    {
                        System.Text.Encoding CorrectEncoding=System.Text.Encoding.GetEncoding(GetCharatset(result));

                        HttpWebRequest client2=(HttpWebRequest)HttpWebRequest.Create(Helper.value1);

                        HttpWebResponse response2=(HttpWebResponse)client2.GetResponse();

                        System.IO.Stream srm2=response2.GetResponseStream();

                        sr=new System.IO.StreamReader(srm2,CorrectEncoding);

                        result=sr.ReadToEnd();
                    }
                }

                mFrm.InfoShotcut("Henter webside......");
            }
            catch (Exception ex)
            {
                // handle error
                MessageBox.Show( ex.Message );
            }

И это сработало замечательно, но теперь я попробовал его на сайте, где говорится, что он использует

<code><pre>
&lt;META http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

Но на самом деле в UTF-8, как мне узнать, что я могу сохранить файл с правильной кодировкой.

1 Ответ

1 голос
/ 27 декабря 2011

Во-первых, заголовок Content-Encoding не описывает используемый набор символов.Как сказано в RFC :

Кодировки содержимого в основном используются для того, чтобы позволить документу сжиматься или иным образом эффективно преобразовываться без потери идентичности его основного типа носителя и без потери информации.

Используемый набор символов описан в заголовке Content-Type.Например:

Content-Type: text/html; charset=UTF-8

Ваш код выше, который использует заголовок Content-Encoding, не будет правильно идентифицировать набор символов.Вы должны взглянуть на заголовок Content-Type, найти точку с запятой, если она есть, а затем проанализировать параметр charset.

И, как вы обнаружили, его также можно описать в HTML META tag.

Или, может быть, вообще нет определения набора символов, и в этом случае вам нужно что-то по умолчанию.Мой опыт показывает, что по умолчанию UTF-8 является хорошим выбором.Это не на 100% надежно, но кажется, что сайты, которые не включают параметр charset с полем Content-Type , обычно , по умолчанию имеют значение UTF-8.Я также обнаружил, что теги META, если они существуют, почти наполовину неверны.

Как упомянул LB в своем комментарии, можно загрузить байты и исследовать их, чтобы определить кодировку.Это может быть сделано с удивительной степенью точности, но требует много кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...