ВСЕ ПЕРЕРЫЛ - ВЕСЬ ИЗМУЧИЛСЯ, НО НИЧЕГО НЕ НАШЕЛ ПРО UTF-8

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Rewizorr
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 18.03.2007 (Вс) 5:04

ВСЕ ПЕРЕРЫЛ - ВЕСЬ ИЗМУЧИЛСЯ, НО НИЧЕГО НЕ НАШЕЛ ПРО UTF-8

Сообщение Rewizorr » 21.07.2008 (Пн) 2:09

ВСЕ ПЕРЕРЫЛ - ВЕСЬ ИЗМУЧИЛСЯ, НО НИЧЕГО НЕ НАШЕЛ ПРО UTF-8.
Видимо, я хочу чего-то сверхъестественного, раз нигде ничего нет про это.
Итак, трабл. Сохраняю файл из интернета командой "Call DownloadFile". Лампочка зажглась, но слюна не потекла. Почему? Потому что затем я открываю скачанный файл в своей проге, а получаю что?
СУКА БЛЯТЬ!!! КАК МЕНЯ УЖЕ ЗАЕБАЛА ЭТА ПРОБЛЕМА!!! ЮТФ-8 - СУКА!
Извините, не выдержал, сорвалось. Я ведь и так и сяк, а не хрена ничего не получается. Пытался посимвольно переписать в АНСИ, но слишком тормозит, когда переписываешь целую страницу, да и вообще, так что пришлось отказаться.
На код
Код: Выделить всё
Do While Not EOF(1)
Line Input #1, s
s = StrConv(s, vbFromUnicode)
Print #2, s
Loop

Выдает:
Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!•Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!Я идиот! Убейте меня, кто-нибудь!†??
********************На КОД:******************************
Код: Выделить всё
s = StrConv(StrConv(s, vbUnicode), vbFromUnicode)

Добавляет пару пробелов и все!
[b] Что мне делать? ХЕЛП МИ!
Код: Выделить всё
[/b]

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 21.07.2008 (Пн) 9:01

а ты уверен в целевых кодировках? перекодировщиком пробовал?
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

HiSER
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 88
Зарегистрирован: 04.07.2007 (Ср) 18:17

Сообщение HiSER » 21.07.2008 (Пн) 9:52

поиск по:
MultiByteToWideChar
WideCharToMultiByte

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 21.07.2008 (Пн) 10:32

Код: Выделить всё
    Set stream = CreateObject("ADODB.Stream")
    stream.Type = 2
    stream.Charset = "Windows-1251"
    stream.open
    stream.Writetext "СУКА БЛЯТЬ!!! КАК МЕНЯ УЖЕ ЗАЕБАЛА ЭТА ПРОБЛЕМА!!! ЮТФ-8 - СУКА! "
    stream.position = 0
    stream.Charset = "UTF-8"
    MsgBox stream.readtext

Хмм.... Конвертится довольно просто обычным стримом. :lol:

Rewizorr
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 18.03.2007 (Вс) 5:04

Сообщение Rewizorr » 21.07.2008 (Пн) 14:52

Что значит целевые кодировки? Мне надо, чтобы не абракадабра отображалась при раскрытии файла скачанного из инета.
И каким перекодировщиком можно из ЮТФ-8 перевести текст в АНСИ?

Rewizorr
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 18.03.2007 (Вс) 5:04

Сообщение Rewizorr » 21.07.2008 (Пн) 14:54

SebasЧто значит целевые кодировки? Мне надо, чтобы не абракадабра отображалась при раскрытии файла скачанного из инета.
И каким перекодировщиком можно из ЮТФ-8 перевести текст в АНСИ?

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 21.07.2008 (Пн) 16:29

Ты уверен, что исходны текст в нужной кодировке? есть программы перекодировки - проверь, а потом уже код пиши.
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Rewizorr
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 18.03.2007 (Вс) 5:04

Сообщение Rewizorr » 21.07.2008 (Пн) 18:37

Sebas
ALX_2002
HiSER
И другим
У меня создается такое ощущение, что мы разговариваем немного на разных языках. Попробую перейти с вами на международный - Visual Basic.
Итак, уважаемые знатоки, перед вами черный ящик, в нем код, скопируйте его в редактор и бросьте на форму текстовое поле с multiLine=true. Запустите проект. А теперь вопрос - как сделать, чтобы отображалась кириллица?
Если сделаете, чтобы отображалась киррилица, то будете молодчиками. Жду мой вылеченный исходник.
Больной, пройдите в кабинет, вас осмотрит доктор! А вот и больной.
Код: Выделить всё
Dim s As String, s1 As String
Private 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 Event ErrorDownload(FromPathName As String, ToPathName As String)
Public Event DownloadComplete(FromPathName As String, ToPathName As String)
Public Function DownloadFile(FromPathName As String, ToPathName As String)
If URLDownloadToFile(0, FromPathName, ToPathName, 0, 0) = 0 Then
DownloadFile = True
RaiseEvent DownloadComplete(FromPathName, ToPathName)
Else
DownloadFile = False
RaiseEvent ErrorDownload(FromPathName, ToPathName)
End If
End Function
Private Sub Form_Load()
If Text1.MultiLine = False Then MsgBox "Установите в Text1 на MultiLine значение ''True'' чтоб увидеть код!", vbExclamation
Form1.Width = 5000 'делаем размеры формы, чтобы увидеть определенный участок на странице
Form1.Height = 5000
With Text1 'размещаем текстовое поле так, чтобы вам было лучше видно код скачанной страницы
.Width = Form1.Width
.Height = Form1.Height
.Left = 1
.Top = 1
End With

Me.Caption = "Найдите здесь кириллицу"
Call DownloadFile("http://irr.ru", Environ("windir") & "\Temp\y.htm") 'закачиваем страницу из интернета
Open Environ("windir") & "\Temp\y.htm" For Input As #1 'открываем файл для записи кода в текстовое поле
For i = 0 To 44 'перелистываем строки на ту строку, где вы увидете кириллицу во всей своей красе
Line Input #1, s
s1 = s1 & s & Chr(13) & Chr(10)
Next
MsgBox s, vbCritical, "НУ И ГДЕ ЗДЕСЬ КИРИЛЛИЦА?" 'показываем строчку, где преобладает кириллица
MsgBox "Ответ: между знаками ''<div>'' и ''<\div>''", vbInformation, "НУ И ГДЕ ЗДЕСЬ КИРИЛЛИЦА?"
MsgBox "'вывод - все страницы интернета, где содержится код ''charset=UTF-8'' сохраняются в ЮТФ-8, а хочется Windows-1251. Или хотя бы чтобы видеть не абракадабру, а русские буквы", vbInformation, s
Do While Not EOF(1) 'довершаем запись скачанной страницу в текстовое поле
Line Input #1, s
s1 = s1 & s & Chr(13) & Chr(10)
Loop
Text1 = s1 'выводим из переменной текст в текстовое поле
Text1.SelStart = 640 'выделяем кириллицу
Text1.SelLength = 382
Close #1
End Sub
'вывод - все страницы интернета, где содержится код ''charset=UTF-8'' сохраняются в ЮТФ-8, а хочется Windows-1251. Или хотя бы чтобы видеть не абракадабру, а русские буквы

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 21.07.2008 (Пн) 18:48

Код: Выделить всё
Private Declare Function MultiByteToWideChar Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpMultiByteStr As String, ByVal cchMultiByte As Long, ByVal lpWideCharStr As String, ByVal cchWideChar As Long) As Long

Private Declare Function WideCharToMultiByte Lib "kernel32" ( _
    ByVal CodePage As Long, ByVal dwFlags As Long, _
    lpWideCharStr As Integer, _
    ByVal cchWideChar As Long, _
    lpMultiByteStr As Byte, _
    ByVal cchMultiByte As Long, _
    ByVal lpDefaultChar As String, _
    ByVal lpUsedDefaultChar As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal length As Long)

Private Const CP_UTF8       As Long = 65001
Public Function UTF8ToWin(ByRef inString As String) As String

Dim iStrSize    As Long
Dim Uc As String
If Len(inString) = 0 Then Exit Function

iStrSize& = MultiByteToWideChar(CP_UTF8, 0&, inString, &HFFFF, Uc, 0)
If Len(iStrSize) Then
     Uc = String$(iStrSize * 2, 0&)
     Call MultiByteToWideChar(CP_UTF8, 0&, inString, &HFFFF, Uc, iStrSize)
     UTF8ToWin = StrConv(Uc, vbFromUnicode)
End If
End Function
Public Function WinToUTF8(ByRef inString As String) As String
Dim res As Long
Dim UTF8Buffer() As Byte
Dim UTF16Buffer() As Integer
Dim length As Long
Dim Uc$

length = Len(inString)
If length = 0 Then Exit Function

ReDim UTF16Buffer(0 To length + 1) As Integer
CopyMemory UTF16Buffer(0), ByVal StrPtr(inString), length * 2
'

' First, find out how big a UTF8 buffer we need:
res = WideCharToMultiByte(CP_UTF8, 0, UTF16Buffer(LBound(UTF16Buffer)), length, 0, 0, vbNullString, 0)
If res = 0 Then Exit Function

' OK, now do the conversion:
ReDim UTF8Buffer(0 To res - 1)
res = WideCharToMultiByte(CP_UTF8, 0, UTF16Buffer(LBound(UTF16Buffer)), length, UTF8Buffer(0), res, vbNullString, 0)
If res = 0 Then Exit Function

' I never got this far in the function to see if this works correctly...
WinToUTF8 = StrConv(UTF8Buffer, vbUnicode)
End Function

Rewizorr
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 18.03.2007 (Вс) 5:04

Сообщение Rewizorr » 21.07.2008 (Пн) 19:34

Alexanbar Я же специально свой код выложил, чтобы его усовершенствовали. Ваш вариант в мой код не вживляется или вообще нерабочий. Как перевести с помощью вашего кода текст в Text1 UTF-ВОСЕМЬ в кириллицу? Буквально.

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 21.07.2008 (Пн) 20:53

Rewizorr писал(а):Alexanbar Я же специально свой код выложил, чтобы его усовершенствовали. Ваш вариант в мой код не вживляется или вообще нерабочий. Как перевести с помощью вашего кода текст в Text1 UTF-ВОСЕМЬ в кириллицу? Буквально.


Код: Выделить всё

'результат:

OutputString$=UTF8ToWin(text1.text)

Rewizorr
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 18.03.2007 (Вс) 5:04

Сообщение Rewizorr » 22.07.2008 (Вт) 3:28

Alexanbar

О, великий гуру! Спасибо!


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 42

    TopList