Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/48: Рейтинг темы: голосов - 48, средняя оценка - 4.56
178 / 68 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
1

Как определить кодировку текста с кириллицей

10.02.2016, 07:47. Показов 9885. Ответов 33
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Имеем коротенький текстовый файл. Грузим его (вставляем кусок через буфер обмена) в TextBox. Получаем вместо кириллицы "кракозябры". Как определить кодировку текста с кириллицей и изменить её.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.02.2016, 07:47
Ответы с готовыми решениями:

Как изменить кодировку текста?
Мне нужно прочить файл использую My.Computer.FileSystem.ReadAllText() но оно мне возвращает текст...

Как получить кодировку текста?
Доброго всем времени. Есть строка: D0D6E5F8DD06 (6D5E8FDD60) Знаю результат: VK.com Как получить...

Как автоматически определить кодировку при открытии текстового файла?
Есть прорамма типа блокнот. Для текста используется RTB. После открытия файла у пользователя есть...

Изменить кодировку текста в TextBox
Я нашел инфу как поменять кодировку текста , но не могу понять, как ее поменять непосредственно...

33
29 / 8 / 3
Регистрация: 22.10.2013
Сообщений: 447
12.11.2017, 09:53 21
Author24 — интернет-сервис помощи студентам
OwenGlendower, этим и занимаюсь, несколько сайтов сделаны криво, ошибок валидности на некоторых достигает десятки а то и сотни, согласно validator.w3.org. Для себя собираю базу ссылок, которые не открываются данным кодом. Я вставил User-Agent, посмотрите верно ли, стали некоторые ссылки открыватся, но не все, например:
XML
1
2
55med.ru/interest/10470/index.html
intellect-video.com/9563/videosemka-korporativnogo-novogodnego-prazdnika/
не помогает даже User-Agent.
И в коде ниже хотелось бы убрать лишнее, пусть угадыванием кодировки занимается только UDE.Charp.
VB.NET
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
    '   Функция угадывает кодировку и сама загружает страницу при помощи WebClient
    Public Function DownloadString(address As String, defaultEncoding As Encoding) As String
        If defaultEncoding Is Nothing Then
            Throw New ArgumentNullException("defaultEncoding")
        End If
 
        Dim data As Byte()
        Dim contentTypeHeader As String = Nothing
 
        Using webClient As New WebClient()
            '    Здесь вставляем User-Agent  
            webClient.Headers.Add("user-agent", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36")
            data = webClient.DownloadData(address)
            contentTypeHeader = webClient.ResponseHeaders(HttpResponseHeader.ContentType)
        End Using
 
        Dim reCharset As New Regex("charset=""?([0-9a-zA-Z-]+)""?", RegexOptions.IgnoreCase Or RegexOptions.CultureInvariant)
 
        Dim responseEncoding As Encoding = Nothing
        Dim charset As String = Nothing
 
        If contentTypeHeader IsNot Nothing Then
            Dim m As Match = reCharset.Match(contentTypeHeader)
            If m.Success Then
                charset = m.Groups(1).Value
                Debug.WriteLine(Convert.ToString("DownloadString. Encoding from ContentType header=") & charset)
            End If
        End If
        If charset Is Nothing Then
            ' Заголовок Content-Type отсуствует или не содержит имя кодировки
            ' Ищем тег <meta http-equiv="Content-Type" content="text/html; charset=NAME">
            '     или тег <meta charset="utf-8">
            Dim begin As String = Encoding.ASCII.GetString(data, 0, Math.Min(data.Length, 2048))
            Dim pos As Integer = 0
            While True
                Dim start As Integer = begin.IndexOf("<meta", pos)
                If start = -1 Then
                    Exit While
                End If
                Dim [end] As Integer = begin.IndexOf(">", start + 5)
                If [end] = -1 Then
                    Exit While
                End If
 
                Dim m As Match = reCharset.Match(begin, start, [end] - start)
                If m.Success Then
                    charset = m.Groups(1).Value
                    Debug.WriteLine(Convert.ToString("DownloadString. Encoding from meta=") & charset)
                    Exit While
                End If
 
                pos = [end] + 1
            End While
        End If
        '   Устанавливаем пакет UDE.Charp и снимаем коментарий
        If charset Is Nothing Then
            '   Кодировка не указана ни в заголовке ни в мета-теге
            '   Пытаемся угадать!
            Dim d As New Ude.CharsetDetector()
            d.Feed(data, 0, data.Length)
            d.DataEnd()
            If d.Confidence > 0.8F Then
                charset = d.Charset
            End If
        End If
 
        If charset IsNot Nothing Then
            Try
                responseEncoding = Encoding.GetEncoding(charset)
            Catch generatedExceptionName As ArgumentException
            End Try
        End If
 
        responseEncoding = If(responseEncoding, defaultEncoding)
        Return responseEncoding.GetString(data)
    End Function
Причем, по второй ссылке, которую выше привел, даже мешается User-Agent. Т.к. даже простой код ниже скачивает её, очень странно, что помешал User-Agent.
VB.NET
1
2
3
4
5
6
7
        Dim htmlsrc As String = ""
        Using wc As New WebClient()
            'WebClient.Headers.Add("user-agent", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36")
            wc.Encoding = Encoding.UTF8
            htmlsrc = wc.DownloadString(url)
        End Using
        TextBox1.Text = htmlsrc
0
Администратор
Эксперт .NET
17022 / 13374 / 5218
Регистрация: 17.03.2014
Сообщений: 27,351
Записей в блоге: 1
12.11.2017, 21:35 22
Цитата Сообщение от Egor2014 Посмотреть сообщение
Я вставил User-Agent, посмотрите верно ли
Верно

Цитата Сообщение от Egor2014 Посмотреть сообщение
стали некоторые ссылки открыватся, но не все, например:
XML
1
2
55med.ru/interest/10470/index.html
intellect-video.com/9563/videosemka-korporativnogo-novogodnego-prazdnika/
У меня эти ссылки открываются без проблем. Русский текст в читабельном виде.

Цитата Сообщение от Egor2014 Посмотреть сообщение
Причем, по второй ссылке, которую выше привел, даже мешается User-Agent. Т.к. даже простой код ниже скачивает её, очень странно, что помешал User-Agent.
VB.NET
1
2
3
4
5
6
7
        Dim htmlsrc As String = ""
        Using wc As New WebClient()
            'WebClient.Headers.Add("user-agent", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36")
            wc.Encoding = Encoding.UTF8
            htmlsrc = wc.DownloadString(url)
        End Using
        TextBox1.Text = htmlsrc
Ничему он мешает. В коде ошибке. Строка №3 должна быть такой:
VB.NET
3
            wc.Headers.Add("user-agent", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36")
0
29 / 8 / 3
Регистрация: 22.10.2013
Сообщений: 447
12.11.2017, 22:13 23
Насчет 3строки я поторопился, не отредактировал.

Высылаю проект, в нем можно попробовать загрузить 2 ссылки, которые выше, они у меня точно не работают...
Вложения
Тип файла: zip WindowsApp1.zip (278.1 Кб, 2 просмотров)
0
29 / 8 / 3
Регистрация: 22.10.2013
Сообщений: 447
12.11.2017, 22:22 24
Еще пример шлю с коротким кодом (как выше), где в Combox заложены эти же ссылки на выбор, тоже не работает.
Вложения
Тип файла: zip WindowsApp4.zip (273.5 Кб, 2 просмотров)
0
Администратор
Эксперт .NET
17022 / 13374 / 5218
Регистрация: 17.03.2014
Сообщений: 27,351
Записей в блоге: 1
12.11.2017, 23:39 25
Цитата Сообщение от Egor2014 Посмотреть сообщение
Высылаю проект, в нем можно попробовать загрузить 2 ссылки, которые выше, они у меня точно не работают...
У меня работает
Как определить кодировку текста с кириллицей
Как определить кодировку текста с кириллицей


Цитата Сообщение от Egor2014 Посмотреть сообщение
Еще пример шлю с коротким кодом (как выше), где в Combox заложены эти же ссылки на выбор, тоже не работает.
От этого примера мало толка т.к. там не используется авто-определение кодировки.

Я обратил внимание что в обоих проектах используется .NET 4.5.2. Это значит что можно использовать класс HttpClient который умеет автоматически определять кодировку по заголовку Content-Type. Этого должно быть достаточно.
VB.NET
1
2
3
4
5
6
Dim htmlsrc As String
Using http As New HttpClient
    http.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36")
    'htmlsrc = http.GetStringAsync("http://55med.ru/interest/10470/index.html").Result
    htmlsrc = http.GetStringAsync("http://intellect-video.com/9563/videosemka-korporativnogo-novogodnego-prazdnika/").Result
End Using
Нужно добавить ссылку на сборку System.Net.Http и такой же Imports.
2
29 / 8 / 3
Регистрация: 22.10.2013
Сообщений: 447
13.11.2017, 11:21 26
Разобрался в причине, ативирус блокировал (KIS 18.0.0.405d), пришлось вносить exe в доверенные программы.
HttpClient хорошо парсит, в цикле у меня проверка по разным ссылкам, но если кодировка 1251 не понимает.

Мне понравился WebClient с функцией DownloadString.
И еще если у сайта 504 Gateway Time-out, то начинает долго думать WebClient потом у меня в исключение уходит, как сократить время на обдумывание:
VB.NET
1
2
3
4
5
6
7
        Try            
                '   В html весь код проверяемой страницы               
                html = DownloadString(DataGridView1.Item(0, CellStroka).Value, System.Text.Encoding.Default)
            Catch ex As Exception
                DataGridView1.Item(1, CellStroka).Value = "ERROR Load Page"
                GoTo load1
            End Try
Еще один вариант, если ошибка проверяемой ссылки 404, то как это сразу можно отловить WebClient -ом?

OwenGlendower, можно функцию DownloadString сократить до минимума, поскольку есть излишний код, с задачей кодировки думаю на 100% справится UDE.Charp.
0
Администратор
Эксперт .NET
17022 / 13374 / 5218
Регистрация: 17.03.2014
Сообщений: 27,351
Записей в блоге: 1
13.11.2017, 11:28 27
Цитата Сообщение от Egor2014 Посмотреть сообщение
HttpClient хорошо парсит, в цикле у меня проверка по разным ссылкам, но если кодировка 1251 не понимает.
Пример такого сайта?

Цитата Сообщение от Egor2014 Посмотреть сообщение
И еще если у сайта 504 Gateway Time-out, то начинает долго думать WebClient потом у меня в исключение уходит, как сократить время на обдумывание
Никак не сократить. Придется ждать ответа.

Цитата Сообщение от Egor2014 Посмотреть сообщение
можно функцию DownloadString сократить до минимума, поскольку есть излишний код, с задачей кодировки думаю на 100% справится UDE.Charp.
Увы не справится. Его сбивает с толку html разметка и он возвращает Nothing в качестве кодировки. Поэтому не надо ничего сокращать в ней.
1
29 / 8 / 3
Регистрация: 22.10.2013
Сообщений: 447
13.11.2017, 12:08 28
Проверил заново, с другого компа дома (до этого проверял на работе).
HttpClient все проверил как положено (в таблице было 136 ссылок), с кодировкой порядок, огромное спасибо!
Буду проверять другие ссылки, может быть нарою что-то...
0
29 / 8 / 3
Регистрация: 22.10.2013
Сообщений: 447
13.11.2017, 12:59 29
Нашел все-таки ссылки где с кодировкой проблема:
XML
1
2
3
4
5
6
7
8
9
10
11
12
video-wedding.ru/service_video.php
www.moi-kotenok.ru/view_invited_paper.php?id=1885
www.sv-battle.ru/board_announce_1879.html
dm-film.ru/viezdnaya_tseremoniya_brakosochetaniya_i_videosyemka.html
yas-center.ru/280213/965/
luk-media.ru/comments/406
inetmarket.su/good_links.php
buturlinovka.ru/news/474-gazprom-i-voronezhskaya-oblast-budut-razvivat-nauchno-tehnicheskoe-sotrudnichestvo.html
www.linuxrsp.ru/information/catalogues/index229.html
club-se.ru/novinki-sony-ericsson/sony-mobile-predstavlyaet-xperia-1.html
goldensofit.ru/news/105.htm
www.ptitca.ru/poleznie-statii/videosemka-svadeb-i-prazdnikov-ot-x-studios.html
Проверяю так:
VB.NET
1
2
3
4
5
        Dim CellStroka As String = ComboBox1.Text
        Using http As New HttpClient
            http.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36")
            TextBox1.Text = http.GetStringAsync(CellStroka).Result
        End Using
Вложения
Тип файла: zip WindowsApp4-1.zip (280.4 Кб, 2 просмотров)
1
Администратор
Эксперт .NET
17022 / 13374 / 5218
Регистрация: 17.03.2014
Сообщений: 27,351
Записей в блоге: 1
13.11.2017, 13:17 30
Egor2014, не думал что неправильно сконфигурованные сайты остались в таком количестве. Все приведенные ссылки не указывают кодировку в заголовке Content-Type, а делают это в мета-теге. Класс HttpClient берет во внимание только заголовок. Это значит что придется все-таки использовать метод DownloadString.
2
29 / 8 / 3
Регистрация: 22.10.2013
Сообщений: 447
13.11.2017, 13:35 31
CMS Wordpress в метатеге пишет кодировку
HTML5
1
<meta charset="UTF-8" />
почему же неправильно.
0
Администратор
Эксперт .NET
17022 / 13374 / 5218
Регистрация: 17.03.2014
Сообщений: 27,351
Записей в блоге: 1
13.11.2017, 14:04 32
Egor2014, потому что когда кодировка указана в заголовке Content-Type браузеру проще разобрать ответ. И если бы все сайты так делали, то нам не нужно было бы обсуждать как определить кодировку страницы

https://www.w3.org/Internation... clarations
1
29 / 8 / 3
Регистрация: 22.10.2013
Сообщений: 447
14.11.2017, 14:17 33
Нашел ссылку, которую не загружает WebClient, видимо связано с Cookie или страница скриптом собирается?
XML
1
blogfiscal.ru/?p=12736
1
Администратор
Эксперт .NET
17022 / 13374 / 5218
Регистрация: 17.03.2014
Сообщений: 27,351
Записей в блоге: 1
14.11.2017, 14:53 34
Лучший ответ Сообщение было отмечено Yury Komar как решение

Решение

Egor2014, данной странице нужна cookie с именем beget. Без неё страница не загружается как ожидается. Обходится добавлением вспомогательного класса CookieWebClient
CookieWebClient
VB.NET
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
<System.ComponentModel.DesignerCategory("Code")>
Class CookieWebClient
   Inherits WebClient
 
   Private _cookies As CookieContainer
 
   Public Sub New()
       _cookies = New CookieContainer()
   End Sub
 
   Public Sub New(cookies As CookieContainer)
       _cookies = cookies
   End Sub
 
   Public ReadOnly Property Cookies As CookieContainer
       Get
           Return _cookies
       End Get
   End Property
 
   Protected Overrides Function GetWebRequest(address As Uri) As WebRequest
       Dim request As WebRequest = MyBase.GetWebRequest(address)
       Dim httpRequest As HttpWebRequest = TryCast(request, HttpWebRequest)
       If httpRequest IsNot Nothing Then
           httpRequest.CookieContainer = _cookies
       End If
       Return request
   End Function
 
End Class

И небольшой модификацией метода DownloadString
DownloadString
VB.NET
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
80
81
82
83
84
85
86
Public Function DownloadString(address As String) As String
   Return DownloadString(address, Encoding.UTF8, Nothing)
End Function
 
Public Function DownloadString(address As String, defaultEncoding As Encoding) As String
   Return DownloadString(address, defaultEncoding, Nothing)
End Function
 
Public Function DownloadString(address As String, defaultEncoding As Encoding, cookies As CookieContainer) As String
   If defaultEncoding Is Nothing Then
       Throw New ArgumentNullException("defaultEncoding")
   End If
   If cookies Is Nothing Then
       cookies = New CookieContainer
   End If
 
 
   Dim data As Byte()
   Dim contentTypeHeader As String = Nothing
 
   Using webClient As New CookieWebClient(cookies)
       webClient.Headers.Add("user-agent", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36")
       data = webClient.DownloadData(address)
       contentTypeHeader = webClient.ResponseHeaders(HttpResponseHeader.ContentType)
   End Using
 
   Dim reCharset As New Regex("charset=""?([0-9a-zA-Z-]+)""?", RegexOptions.IgnoreCase Or RegexOptions.CultureInvariant)
 
   Dim responseEncoding As Encoding = Nothing
   Dim charset As String = Nothing
 
   If contentTypeHeader IsNot Nothing Then
       Dim m As Match = reCharset.Match(contentTypeHeader)
       If m.Success Then
           charset = m.Groups(1).Value
           Debug.WriteLine("DownloadString. Encoding from ContentType header=" & charset)
       End If
   End If
   If charset Is Nothing Then
       ' Заголовок Content-Type отсуствует или не содержит имя кодировки
       ' Ищем тег <meta http-equiv="Content-Type" content="text/html; charset=NAME">
       '     или тег <meta charset="utf-8">
       Dim begin As String = Encoding.ASCII.GetString(data, 0, Math.Min(data.Length, 2048))
       Dim pos As Integer = 0
       While True
           Dim start As Integer = begin.IndexOf("<meta", pos)
           If start = -1 Then
               Exit While
           End If
           Dim [end] As Integer = begin.IndexOf(">", start + 5)
           If [end] = -1 Then
               Exit While
           End If
 
           Dim m As Match = reCharset.Match(begin, start, [end] - start)
           If m.Success Then
               charset = m.Groups(1).Value
               Debug.WriteLine("DownloadString. Encoding from meta=" & charset)
               Exit While
           End If
 
           pos = [end] + 1
       End While
   End If
   ''   Устанавливаем пакет UDE.Charp и снимаем коментарий
   'If charset Is Nothing Then
   '    '   Кодировка не указана ни в заголовке ни в мета-теге
   '    '   Пытаемся угадать!
   '    Dim d As New Ude.CharsetDetector()
   '    d.Feed(data, 0, data.Length)
   '    d.DataEnd()
   '    If d.Confidence > 0.8F Then
   '        charset = d.Charset
   '    End If
   'End If
 
   If charset IsNot Nothing Then
       Try
           responseEncoding = Encoding.GetEncoding(charset)
       Catch ex As ArgumentException
       End Try
   End If
 
   responseEncoding = If(responseEncoding, defaultEncoding)
   Return responseEncoding.GetString(data)
End Function

И наконец использование:
VB.NET
1
2
3
Dim cookies As New CookieContainer()
cookies.Add(New Uri("http://blogfiscal.ru"), New Cookie("beget", "begetok", "/") With { .Expires = DateTime.Now.AddDays(1000) })
Dim html As String = DownloadString("http://blogfiscal.ru/?p=12736", Encoding.UTF8, cookies)
Добавлено через 3 минуты
По хорошему конечно нужно использовать класс который поддерживает выполнение JavaScript. Класс WebClient это не умеет. К сожалению в рамках самого .NET единственной альтернативой является компонент WebBrowser, но он слишком тяжеловесный и неудобный в использовании.
4
14.11.2017, 14:53
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.11.2017, 14:53
Помогаю со студенческими работами здесь

Как определить кодировку текста?
Доброго времени суток. Подскажите как автоматически определить кодировку будь то русский или...

Как можно определить кодировку текста используя VB(DOS, WIN, KOI ...)?
Как можно определить кодировку текста используя VB(DOS, WIN, KOI ...)?

Как в "Microsoft.XMLHTTP" определить кодировку текста
Скачиваю страницу из сети (см. код ниже). Но, вместо всех русских букв появляются вопросы - не...

Как отличить текст кириллицей от текста латиницей
У меня есть 2 цикла, 1 цикл выполняет проверку слов в тексте через переменную char1 в которой...


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

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru