UTF8 - страничка

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

UTF8 - страничка

Сообщение Debugger » 28.03.2010 (Вс) 21:50

В коде необходимо создать страничку и сохранить её в кодировке UTF8. Нагуглил функцию конвертации, и сотворил:
Код: Выделить всё
Private Const CP_UTF8 = 65001
Private Declare Function WideCharToMultiByte Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long, ByVal lpMultiByteStr As Long, ByVal cchMultiByte As Long, ByVal lpDefaultChar As Long, lpUsedDefaultChar As Long) As Long
Private Declare Function MultiByteToWideChar Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpMultiByteStr As Long, ByVal cchMultiByte As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long
Private Declare Function GetACP Lib "kernel32" () As Long

Function EncodeUTF8(ByVal cnvUni As String)
    If cnvUni = vbNullString Then Exit Function
    EncodeUTF8 = StrConv(WToA(cnvUni, CP_UTF8, 0), vbUnicode)
End Function

'--------------------------------
'   WToA
'
'   UNICODE to ANSI conversion, via a given codepage
'--------------------------------
Public Function WToA(ByVal st As String, Optional ByVal cpg As Long = -1, Optional lFlags As Long = 0) As String
    Dim stBuffer As String
    Dim cwch As Long
    Dim pwz As Long
    Dim pwzBuffer As Long
    Dim lpUsedDefaultChar As Long
   
    If cpg = -1 Then cpg = GetACP()
    pwz = StrPtr(st)
    cwch = WideCharToMultiByte(cpg, lFlags, pwz, -1, 0&, 0&, ByVal 0&, ByVal 0&)
    stBuffer = String$(cwch + 1, vbNullChar)
    pwzBuffer = StrPtr(stBuffer)
    cwch = WideCharToMultiByte(cpg, lFlags, pwz, -1, pwzBuffer, Len(stBuffer), ByVal 0&, ByVal 0&)
    WToA = Left$(stBuffer, cwch - 1)
End Function

Private Sub Form_Load()
    Open "C:/test.htm" For Binary As #1
    Dim s As String
    s = "Текст текст текст"
    s = EncodeUTF8(s)
    Put #1, , s
    Close #1
End Sub

Но, похоже, я что-то делаю не так. Браузеры воспринимают получившийся файл как win-1251, что чревато. Если принудительно поставить кодировку UTF8, то всё пашет. Что же я делаю не так, и как сделать, чтобы всё работало?
P.S. Поставить META не советуйте.
Added: что-то мне функция не нравится.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: UTF8 - страничка

Сообщение arthur2 » 29.03.2010 (Пн) 7:29

Артур
 
   

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: UTF8 - страничка

Сообщение Debugger » 29.03.2010 (Пн) 9:21

Хм, у меня почему-то всё равно не пашет:
Код: Выделить всё
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 Long, ByVal cchWideChar As Long) As Long
Private Declare Function WideCharToMultiByte Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long, ByVal lpMultiByteStr As Long, ByVal cchMultiByte As Long, ByVal lpDefaultChar As Long, lpUsedDefaultChar As Long) As Long
Private Const CP_UTF8 = 65001

Public Function UTF8(inString As String) As String
        Dim iStrSize    As Long
        Dim SPtr        As Long
        Dim s           As String
       
        iStrSize = Len(inString)
        s = String$(iStrSize, 0&)



        If iStrSize Then iStrSize = MultiByteToWideChar(CP_UTF8, 0&, inString, &HFFFF, StrPtr(s), iStrSize)
        If iStrSize >= 0 Then
            UTF8 = Left$(s, iStrSize - 1)
        Else
'тут, наверное, тоже что-то надо сделать?
        End If
End Function

Private Sub Form_Load()
    Open "C:/test.htm" For Binary As #1
    Dim s As String
    s = "Текст текст текст"
    s = UTF8(s)
    Put #1, , s
    Close #1
End Sub

У меня почему-то в описании MultiByteToWideChar 3й параметр был As Long. Я поменял его на As String.
idUTF8 - это то же самое, что и CP_UTF8 (65001)?

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: UTF8 - страничка

Сообщение Antonariy » 29.03.2010 (Пн) 10:44

Debugger писал(а):P.S. Поставить META не советуйте.
Советую поставить META. Потому что броузеры ориентируются в первую очередь на нее, во-вторую на собственные настройки кодировки по умолчанию.
А функция правильно не нравится.
Код: Выделить всё
Private Declare Function MultiByteToWideChar Lib "kernel32.dll" (ByVal CodePage As Long, _
    ByVal dwFlags As Long, ByVal lpMultiByteStr As String, ByVal cchMultiByte As Long, _
    ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long
Private Declare Function WideCharToMultiByte Lib "kernel32.dll" (ByVal CodePage As Long, _
    ByVal dwFlags As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long, _
    ByVal lpMultiByteStr As Long, ByVal cchMultiByte As Long, _
    ByVal lpDefaultChar As Long, ByVal lpUsedDefaultChar As Long) As Long

Public Function EncodeUTF8(strSrc As String) As String
    Dim nLen As Long
    Dim strDst As String
    Dim strRet As String
    Dim nRet As Long
    Dim p As Long
   
    nLen = Len(strSrc)
    strDst = String(nLen * 2, Chr(0))
    strRet = String(nLen * 2, Chr(0))
    p = StrPtr(strDst)
    nRet = MultiByteToWideChar(1251, &H1, strSrc, nLen, p, nLen)
    nRet = WideCharToMultiByte(65001, 0, p, nRet, StrPtr(strRet), nLen * 2, ByVal 0, 0)
    EncodeUTF8 = Left$(StrConv(strRet, vbUnicode), nRet)
End Function
Лучший способ понять что-то самому — объяснить это другому.

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: UTF8 - страничка

Сообщение Debugger » 29.03.2010 (Пн) 11:25

Вроде запахало.
Added: почти.
C META-тегом всё пашет, конечно. Да вот меня всё равно эта проблема смущает, неправильно это.
Браузеры обычно пытаются автоопределить кодировку файла, если она не указана. И обычно делают это вполне успешно. Но созданный программой файл они кушать не хотят. Кстати, если файл открыть-сохранить-закрыть блокнотом, то всё внезапно заработает. Так что же Блокнот делает такого волшебного?

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: UTF8 - страничка

Сообщение arthur2 » 29.03.2010 (Пн) 11:43

добавляет в начало файла сигнатуру. Сохрани и посмотри, какие три байта добавились :D
Последний раз редактировалось arthur2 29.03.2010 (Пн) 11:48, всего редактировалось 1 раз.
Артур
 
   

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: UTF8 - страничка

Сообщение Antonariy » 29.03.2010 (Пн) 11:44

Debugger писал(а):C META-тегом всё пашет, конечно. Да вот меня всё равно эта проблема смущает, неправильно это.
Если ты генерируешь файлы для броузера, то это правильно, потому что именно так они работают и не обязаны ничего угадывать.

Debugger писал(а):Так что же Блокнот делает такого волшебного?
Конвертирует в win-1251.

arthur2 писал(а):добавляет в начало файла сингатуру
Как раз из-за отсутствия сигнатуры. Ты бы проверил что ли.
Лучший способ понять что-то самому — объяснить это другому.

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: UTF8 - страничка

Сообщение Debugger » 29.03.2010 (Пн) 11:57

Нет, Блокнот дописывает сигнатуру, 3 байта: 239, 187 и 191. Я тоже заметил, что размеры блокнотовского и исходного файла различаютя. Не знал, что у текстовых файлов есть сигнатура.
В итоге, заработало! Спасибо всем.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: UTF8 - страничка

Сообщение arthur2 » 29.03.2010 (Пн) 12:00

Antonariy писал(а):Ты бы проверил что ли.
Я проверил. Сохранил этот топик, открыл блокнотом и стёр в файле charset=UTF-8
Firefox и Internet Explorer с чтением по сигнатуре справились и без МЕТЫ :D
Артур
 
   

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: UTF8 - страничка

Сообщение Debugger » 29.03.2010 (Пн) 12:21

Ещё одна проблемка выявилась.
На компьютере всё читается отлично. Но после загрузки по FTP Opera и FF ВНЕЗАПНО отказываются отображать нормально.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: UTF8 - страничка

Сообщение Antonariy » 29.03.2010 (Пн) 12:24

Сохранил этот топик, открыл блокнотом.
Похоже это зависит от размера и содержимого файла. Я создавал новый файл в студии и пересохранял блокнотом — кодировка менялась.
Лучший способ понять что-то самому — объяснить это другому.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: UTF8 - страничка

Сообщение Antonariy » 29.03.2010 (Пн) 12:26

Debugger писал(а):Ещё одна проблемка выявилась.
На компьютере всё читается отлично. Но после загрузки по FTP Opera и FF ВНЕЗАПНО отказываются отображать нормально.
Потому что файл это одно, а ответ сервера — другое. Вероятно FF и Опера обращают внимание на сигнатуру только при чтении файла.
Лучший способ понять что-то самому — объяснить это другому.

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: UTF8 - страничка

Сообщение Debugger » 29.03.2010 (Пн) 13:15

Да, и вправду.
Файлы ... должны быть в кодировке Windows-1251. Кроме того, не надо использовать meta-тег charset.

(отвратительно).
Соответственно, следующий вопрос: как перевести строку в Win1251?
Added: Насколько мне известно, VB выдаёт ANSI-шные фейлы. Таблица ANSI и CP1251 почти совпадают. Надо ли конвертить?

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: UTF8 - страничка

Сообщение Antonariy » 29.03.2010 (Пн) 13:54

Нет.
Лучший способ понять что-то самому — объяснить это другому.

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: UTF8 - страничка

Сообщение Debugger » 29.03.2010 (Пн) 22:01

Хм. А в чём тогда различие между этими кодировками?
(стосорокпятитысячное сообщение в разделе)

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: UTF8 - страничка

Сообщение Antonariy » 30.03.2010 (Вт) 10:44

Для начала ANSI не кодировка, а Американский национальный институт стандартов (American National Standards Institute), а кодировка, им разработанная, называется ASCII (7 бит), название стандарта — ANSI X3.4. Windows-1251 это ее восьмибитное расширение для русского языка, которое используется русской виндой. Фактически именно 1251 и выдает VB потому что использует текущую кодовую страницу системы.

Впрочем, вряд ли тебя забанили на википедии.
Лучший способ понять что-то самому — объяснить это другому.

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: UTF8 - страничка

Сообщение Debugger » 30.03.2010 (Вт) 11:27

Всё, просветился.
Получается, Блокнот неточно говорит?
Вложения
ANSI.png
ANSI.png (47.77 Кб) Просмотров: 2084

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: UTF8 - страничка

Сообщение Antonariy » 30.03.2010 (Вт) 11:34

Наверное прижилось лучше. Больше стандартов кодировок ANSI под свим именем не выпускало, вот и стали называть кодировку именем института.
Лучший способ понять что-то самому — объяснить это другому.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: UTF8 - страничка

Сообщение Хакер » 30.03.2010 (Вт) 11:48

Debugger, так ты прогуливал уроки?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: UTF8 - страничка

Сообщение Antonariy » 30.03.2010 (Вт) 12:35

Отличная статья, теперь хоть понятно почему ANSI.
Лучший способ понять что-то самому — объяснить это другому.

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: UTF8 - страничка

Сообщение Debugger » 30.03.2010 (Вт) 15:11

Да, теперь всё ясно.
Только почему-то в с татье написано, что браузеру следует читать кодировку именно из мета-тега, а не из ответа сервера. IE так делает, а вот другие - нет.


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

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

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

    TopList