Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/40: Рейтинг темы: голосов - 40, средняя оценка - 4.78
16 / 16 / 9
Регистрация: 08.09.2014
Сообщений: 66

Как определить кодировку веб-страницы?

21.01.2015, 00:38. Показов 7537. Ответов 6

Студворк — интернет-сервис помощи студентам
Написал парсер страниц. но некоторые страницы с русским текстом отображаются не правильно в textBox

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
WebRequest request = WebRequest.Create(urlString);
                WebResponse response = request.GetResponse();
                var cont = response.ContentType;
                Stream stream = response.GetResponseStream();
                if (stream != null)
                {
                    using (StreamReader sr = new StreamReader(stream))
                    {
                        str = sr.ReadToEnd();
                        if (cont.Contains("windows-1251"))
                        {
                            Encoding utf = Encoding.UTF8;
                            Encoding win = Encoding.GetEncoding(1251);
 
                            byte[] utfArr = utf.GetBytes(str);
                            byte[] winArr = Encoding.Convert(win, utf, utfArr);
 
                            char[] winChars = new char[utf.GetCharCount(winArr, 0, winArr.Length)];
 
                            utf.GetChars(winArr, 0, winArr.Length, winChars, 0);
 
                            string setNew = new string(winChars);
                        }
                    }
                }
проверяю контекст и если там есть "windows-1251" то сделать конвертацию. но стало ещё хуже..... новые кракозяблы появились

конвертировать пробую так
C#
1
2
3
                           
     byte[] bStr = Encoding.GetEncoding(1251).GetBytes(str);
     string setNew = Encoding.Default.GetString(bStr);
и как выше описал.

не получается.

Что не так. ?

например страница http://www. liveinternet. ru/member.php?action=lostpw немогу получить коректно <title> знаки вопроса ресует
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.01.2015, 00:38
Ответы с готовыми решениями:

Как определить кодировку загруженной страницы?
При получении страници не верная кодировка. НИчего сделать не могу. Вот пример r =...

Как определить кодировку страницы через HttpURLConnection?
как определить кодировку страницы через HttpURLConnection? пытаюсь коннектиться из явы к какому-то сайту, чтобы считать с него страницу....

Как определить кодировку html-страницы при скачивании?
Доброго времени суток уважаемые! Почитал аналогичные темы - не помогло. Задача следующая: 1. Скачать страницу N 2. Проверить...

6
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
21.01.2015, 02:28
rustammv, страница возвращает charset, в котором она закодированна
C#
1
2
3
    var objResponse = (System.Net.HttpWebResponse)objRequest.GetResponse();
    // get correct charset and encoding from the server's header
    string Charset = objResponse.CharacterSet;
0
16 / 16 / 9
Регистрация: 08.09.2014
Сообщений: 66
21.01.2015, 13:08  [ТС]
Psilon,
получаю кодировку так

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
                HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(urlString);
                myHttpWebRequest.Timeout = RequestTimeOut * 1000;
                HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
 
                string Charset = myHttpWebResponse.CharacterSet;
                var cont = myHttpWebResponse.ContentType;
 
                if (!cont.StartsWith("text/"))
                {
                    _urlRemovePage.Add(urlString);
                    OnUpdateCountRemovePage(_urlRemovePage.Count);
                    return str;
                }
                if (Charset == "cp1251") 
                    Charset = "windows-1251";
                if (string.IsNullOrEmpty(Charset)) 
                    Charset = "utf-8";
                var fromEncodind = Encoding.GetEncoding(Charset); //из какой кодировки
 
                Stream stream = myHttpWebResponse.GetResponseStream();
                if (stream != null)
                {
                    using (StreamReader sr = new StreamReader(stream, fromEncodind))
                    {
                        str = sr.ReadToEnd();
                     }
                }
                return str;
но есть глюки
но например вот результат сначала идёт title потом адрес

Ìàðêåò | LiveInternet (http://www.liveinternet.ru/market)

Все самое интересное из мира IT-индустрии / 3DNews - Daily Digital Digest (http://www.3dnews.ru)

бывает что на странице указано windows-1251 а по факту title в другой как это можно отловить (или часть)

ещё вот
Главная страница &bull; Торренты надо?! (http://www.torrnado.ru)

вот эти коды &bull; и т.п. только по словарю http://www.utexas.edu/learn/html/spchar.html менять
или есть какието средства родные у C#
1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
21.01.2015, 14:19
C#
1
2
3
4
5
6
7
8
9
10
11
        private static void Main(string[] args)
        {
            string page = DownloadPage("http://www.3dnews.ru/");
            Console.WriteLine(page);
        }
 
        private static string DownloadPage(string url)
        {
            var client = new HttpClient();
            return client.GetStringAsync(url).Result;
        }
C#
1
using System.Net.Http;
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18304 / 14228 / 5368
Регистрация: 17.03.2014
Сообщений: 28,902
Записей в блоге: 1
22.01.2015, 04:27
rustammv, для правильного отображения текста необходимо знать его кодировку. Веб-сервер может указать кодировку в заголовке Content-Type (предпочтительный способ) или в теле документа с помощью мета-тега. Сайты 3dnews.ru и liveinternet.ru указывают кодировку только в мета-теге. Стандартные классы (WebClient, HttpClient, HttpWebRequest) не поддерживают подобный сценарий. Придется писать самому. Алгоритм примерно такой:
1) Качаем страницу как массив байтов
2.1) Если есть заголовок Content-Type с именем кодировки, то используем её.
2.2) Если нет заголовка, но на странице есть мета-тег с именем кодировки, то используем её.
2.3) Если нет ни того ни другого, то пытаемся угадать. Например, с помощью Mozilla Universal Charset Detector
3) Преобразовываем массив байтов в строку используя найденную кодировку

Пример реализации
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
string DownloadString(string address)
{
    return DownloadString(address, Encoding.UTF8);
}
 
string DownloadString(string address, Encoding defaultEncoding)
{
    if (defaultEncoding == null) throw new ArgumentNullException("defaultEncoding");
    
    byte[] data;
    string contentTypeHeader = null;
    using (WebClient webClient = new WebClient())
    {
        // Некоторые сайты требуют наличия User-Agent
        webClient.Headers.Add(HttpRequestHeader.UserAgent, ".NET Application");
 
        data = webClient.DownloadData(address);
        contentTypeHeader = webClient.ResponseHeaders[HttpResponseHeader.ContentType];
    }
    
    Regex reCharset = new Regex(@"charset=""?([0-9a-zA-Z-]+)""?", RegexOptions.IgnoreCase | RegexOptions.CultureInvariant);
    
    Encoding responseEncoding = null;
    string charset = null;
    
    if (contentTypeHeader != null)
    {
        Match m = reCharset.Match(contentTypeHeader);
        if (m.Success)
        {
            charset = m.Groups[1].Value;
            Debug.WriteLine("DownloadString. Encoding from ContentType header=" + charset);
        }
    }
    if (charset == null)
    {
        // Заголовок Content-Type отсуствует или не содержит имя кодировки
        // Ищем тег <meta http-equiv="Content-Type" content="text/html; charset=NAME">
        //     или тег <meta charset="utf-8">
        string begin = Encoding.ASCII.GetString(data, 0, Math.Min(data.Length, 2048));
        int pos = 0;
        for(;;)
        {
            int start = begin.IndexOf("<meta", pos);
            if (start == -1) break;
            int end = begin.IndexOf(">", start+5);
            if (end == -1) break;
            
            Match m = reCharset.Match(begin, start, end-start);
            if (m.Success)
            {
                charset = m.Groups[1].Value;
                Debug.WriteLine("DownloadString. Encoding from meta=" + charset);
                break;
            }
            
            pos = end + 1;
        }
    }
    /* Устанавливаем пакет UDE.Charp и снимаем коментарий
    if (charset == null)
    {
        // Кодировка не указана ни в заголовке ни в мета-теге
        // Пытаемся угадать!
        Ude.CharsetDetector d = new Ude.CharsetDetector();
        d.Feed(data, 0, data.Length);
        d.DataEnd();
        if (d.Confidence > 0.8f) charset = d.Charset;
    }*/
    
    if (charset != null)
    {
        try { responseEncoding = Encoding.GetEncoding(charset); }
        catch (ArgumentException) { }
    }
    
    responseEncoding = responseEncoding ?? defaultEncoding;
    return responseEncoding.GetString(data);
}

Код работает для сайтов которые ты привел в примерах, но на других я его не проверял.

Цитата Сообщение от rustammv Посмотреть сообщение
вот эти коды &bull; и т.п. только по словарю http://www.utexas.edu/learn/html/spchar.html менять
или есть какието средства родные у C#
Эти символы (точнее entities) зависят от кодировки текста и поэтому придется делать их замену самостоятельно.
4
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
22.01.2015, 10:22
OwenGlendower, офигенно, спасибо, про "угадать" я даже и не знал, только про заголовки и метатеги Еще и уровень значимости можно посмотреть, вообще красавцы.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18304 / 14228 / 5368
Регистрация: 17.03.2014
Сообщений: 28,902
Записей в блоге: 1
22.01.2015, 13:13
Psilon, пожалуйста Браузеры давно занимаются угадыванием кодировок на самом деле. У Microsoft тоже есть собственная реализация детектора.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.01.2015, 13:13
Помогаю со студенческими работами здесь

Как определить сколько было загруженно информации(байт) из интернета, при загрузке веб страницы?
Возможно это как то можно сделать через какой отладчик в браузере?

Как узнать кодировку страницы и нужна ли она вообще?
Вот проверял тошноту и заметил что выдало типа немогу разпознать кодировку, шаблон скачал в инете... кинулся смотреть, а в шаблоне не...

Как задать кодировку программно создаваемой html-страницы
в общем когда вывожу на печать через html выводит кракозябру, если я пиши не на английском private void saveFileDialog1_FileOk(object...

Определить окончание загрузки веб-страницы
Здравствуйте, программисты киберфорума! Возникла у меня проблема, которую костыльно решить несложно, а нормально — я пока не...

Почему при создании веб-страницы в FrontPage автоматически создается папка с изображениями, а при создании веб-страницы в DreamWeaver - нет?
Если я создаю веб-страницу в FrontPage и называю ее, например, page.html, то автоматически создается папка page.files, где хранятся все...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru