Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Не получается с кодировкой / 9 сообщений из 9, страница 1 из 1
02.08.2013, 16:21
    #38353295
Андрей159
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не получается с кодировкой
Хочу скачать (програбать) всю базу данных городов Украины.

Пользуюсь WinHttpRequest. Раньше не подводил. Грабаю отсюда
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Public Function WinHTTPRequestGET(ByVal URL As String, Cookie As Boolean, CookieURL As String, Refer As String) As String
  Dim objWinHttp As WinHttp.WinHttpRequest
  Dim f As Long
    DoEvents
    Set objWinHttp = New WinHttp.WinHttpRequest
    objWinHttp.SetTimeouts 30, 30, 0, 0
    objWinHttp.open "GET", URL, False
    objWinHttp.setRequestHeader "User-Agent", "Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.10.229 Version/11.61"
    objWinHttp.setRequestHeader "Accept", "text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1"
    objWinHttp.setRequestHeader "Accept-Language", "ru-RU,ru;q=0.9,en;q=0.8"
    objWinHttp.setRequestHeader "Accept-Encoding", "default"
    objWinHttp.setRequestHeader "Accept-Charset", "Windows-1251"
    objWinHttp.setRequestHeader "Connection", "Keep-Alive"
    objWinHttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
    
    If Refer <> "" Then objWinHttp.setRequestHeader "Referer", Refer
    If Cookie = True Then If ProcesGetCookie(CookieURL) <> "" Then objWinHttp.setRequestHeader "Cookie", ProcesGetCookie(CookieURL)
    objWinHttp.send
    WinHTTPRequestGET = objWinHttp.responseText
    Set objWinHttp = Nothing
End Function




Разобрал HTML код до первого слова, которое хотел сохранять и наткнулся на кодировку. Ковырял, ковырял. Ничего не получилось. Решил сам переконвертировать.

A ?IIEOUE A IAEANOU =ВІННИЦЬКА ОБЛАСТЬ


Изобретение собственного конвертора не дает результата так как первый символ chr(65) = "В" и девьятый символ также chr(65), но ="А"

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Public Function ConvertToWinTxt(ByVal Txt As String) As String
  ConvertToWinTxt = Txt
  
  ConvertToWinTxt = Replace(ConvertToWinTxt, Chr(65), "В")
  ConvertToWinTxt = Replace(ConvertToWinTxt, Chr(63), "І")
  ConvertToWinTxt = Replace(ConvertToWinTxt, Chr(73), "Н")
  ConvertToWinTxt = Replace(ConvertToWinTxt, Chr(69), "И")
  ConvertToWinTxt = Replace(ConvertToWinTxt, Chr(79), "Ц")
  ConvertToWinTxt = Replace(ConvertToWinTxt, Chr(85), "Ь")
  ConvertToWinTxt = Replace(ConvertToWinTxt, Chr(69), "К")

End Function



Не вышло. Кодировку вроде бы правильно задал. Может неверно objWinHttp.setRequestHeader "Accept-Charset", "Windows-1251" игнорирует, или сервер... На ноуте сейчас нет программы-прослушки TCP:80 HTML (Не вижу запросов и ответов)
...
Рейтинг: 0 / 0
02.08.2013, 16:25
    #38353304
Андрей159
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не получается с кодировкой
времья жалко. попробую еще быстренько на IE сделать если вспомню куда модуль положил готовый. вопрос интересует и дальше "почему"
...
Рейтинг: 0 / 0
02.08.2013, 16:40
    #38353329
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не получается с кодировкой
Надо работать с юникодом
Посмотри и используй функции ChrW и AscW
...
Рейтинг: 0 / 0
02.08.2013, 16:46
    #38353342
Андрей159
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не получается с кодировкой
Мне просто удивительно, что символы один к одному. Я с кодировкой несколько раз стыкался. Понимаю когда два символа идут как за один, или когда есть chr(3), chr(4)... которые говорят о том что после этого кода нужно декодировать в конкретной системе и также еще два символа даются. А тут один в один. Решил через replace и наткнулся на "да ну его нафиг". Нашел старенький IE и все заработало, правда медленней.
Код: vbnet
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.
'ІНТЕРНЕТ ЕКСПЛОВЕР
Public IE(9) As Object
Public PIG_IEZagKstVikon As Long
Public PIG_IEViknoStatus(9) As Boolean

Public Declare Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long

'Закачка
Public Function PBDownloadFile(URL As String, LocalFilename As String) As Boolean
  Dim lngRetVal As Long
  lngRetVal = URLDownloadToFile(0, URL, LocalFilename, 0, 0)
  If lngRetVal = 0 Then PBDownloadFile = True
End Function

Public Sub PIG_VklIE(Nomr As Long, Vsbl As Boolean)
Set IE(Nomr) = CreateObject("InternetExplorer.Application")
    IE(Nomr).Visible = Vsbl
    PIG_IEViknoStatus(Nomr) = True
End Sub
Public Sub PIG_Quit_IE(Nomr As Long)
  IE(Nomr).Quit
  Set IE(Nomr) = Nothing
End Sub
Public Sub PIG_IE_Navigate(Nomr As Long, Adres As String)
    'If PIG_IEViknoStatus(Nomr) = False Then Exit Sub
    IE(Nomr).navigate Adres
End Sub
Public Function PIG_IE_readyState(Nomr As Long) As Long
  PIG_IE_readyState = IE(Nomr).readyState
End Function
Public Function PIG_IE_innerHTML(Nomr As Long) As String
  PIG_IE_innerHTML = IE(Nomr).document.documentElement.innerHTML
  'IE(Nomr).document.documentElement.outerhtml
End Function
Public Function PIG_IE_outnerHTML(Nomr As Long) As String
  PIG_IE_outnerHTML = IE(Nomr).document.documentElement.outerHTML
End Function

'Взнати бітрейд який ще не визначався
Public Function PIG_VznatiNevidomiyBitred() As Long
  PIG_VznatiNevidomiyBitred = -1
  Dim f As Long
'''  For f = 0 To 2000
'''    If ZmL_Select(f) = False And ZmL_Artist(f) <> "" And ZmL_Track(f) <> "" Then PIG_VznatiNevidomiyBitred = f: Exit Function
'''  Next
End Function
Public Function PIG_WaitForStageOkOrError(Nomr As Long, tmrSecMax As Long) As Boolean
  Dim i As Long
  For i = 1 To tmrSecMax * 10
  Call Sleep(100)
    If PIG_IE_readyState(Nomr) = 4 Then
      PIG_WaitForStageOkOrError = True
      Exit Function
    End If
  Next
End Function
...
Рейтинг: 0 / 0
02.08.2013, 17:03
    #38353375
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не получается с кодировкой
Ты просто принимаешь текст в юникоде, Replace прекрасно справляется с заменой юникода, но надо ему правильное задание дать, с помощью ChrW, а не с помощью Chr
...
Рейтинг: 0 / 0
02.08.2013, 17:39
    #38353438
Андрей159
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не получается с кодировкой
я сам в коде запутался. Первый символ и девьятый просто одинаковы приходят а на самом деле разные
я начал с
ConvertToWinTxt = Replace(ConvertToWinTxt, Chr( 65 ), " В ")
ConvertToWinTxt = Replace(ConvertToWinTxt, Chr(63), "І")
ConvertToWinTxt = Replace(ConvertToWinTxt, Chr(73), "Н")
ConvertToWinTxt = Replace(ConvertToWinTxt, Chr(69), "И")
ConvertToWinTxt = Replace(ConvertToWinTxt, Chr(79), "Ц")
ConvertToWinTxt = Replace(ConvertToWinTxt, Chr(85), "Ь")
ConvertToWinTxt = Replace(ConvertToWinTxt, Chr(69), "К")

следующий символ получился бы снова
ConvertToWinTxt = Replace(ConvertToWinTxt, Chr( 65 ), " А ")

А с юникодом как ? Есть байт как не крути. Разве в as String может быть еще что-то вместо того ж байта ? Знаю что может быть два байта который тогда можно конвертировать в один.
...
Рейтинг: 0 / 0
02.08.2013, 17:50
    #38353459
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не получается с кодировкой
В стринге может быть юникод (два байта на символ). Как только ты пытаешься его вывести на экран или в контрол, он автоматом конвертируется в Win. Можно вывести его, например, в Ворд, тогда он останется в юникоде. Можно просматривать его с помощью AscW.

(ЗЫ: я просто предполагаю, что это юникод, может это что-то другое. Что написано в полученном html-файле, какая кодировка в заголовке? Так или иначе, можно попробовать решить проблему с помощью Replace+ChrW, предварительно проанализировав с помощью AscW)
...
Рейтинг: 0 / 0
02.08.2013, 23:33
    #38353670
скукотища
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не получается с кодировкой
Андрей159,
правда не VB, а VBA:
Код: vbnet
1.
2.
3.
4.
? mid( replace(strconv(objWinHttp.responseText,vbUnicode),vbNullChar,""), 18600,400 )
href="vinitsa.htm">ВІННИЦЬКА ОБЛАСТЬ    </a></p></td><td colspan=2 bgcolor="#FFFFFF"> <p align="left">  <a href="vinitsa.htm">ВИНИЦКАЯ ОБЛАСТЬ  </a></p></td></tr>
<tr><td colspan=2 bgcolor="#FFFFFF"> <p>    <a href="volin.htm">ВОЛИНСЬКА ОБЛАСТЬ   </a></p></td><td colspan=2 bgcolor="#FFFFFF"> <p align="left">  <a href="volin.htm">ВОЛЫНЬСКАЯ ОБЛАСТЬ  </a></p></td></tr>
<tr><td colspan=2 bgcolor="#FFFFFF"> <p>

ЗЫ: "лишние" пробелы - издержки конвертирования символа табуляции.
...
Рейтинг: 0 / 0
02.08.2013, 23:53
    #38353683
Андрей159
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не получается с кодировкой
Большое Спасибо.
К концу дня домучил. Получил проиндексированную базу: область->район->город
(-> = подчиненная таблица)

Есть сайты, где за готовую базу предлогают 25$. Пришлось хорошенько потрепаться чтоб накопить самостоятельно свою базу.
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Не получается с кодировкой / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]