Перевод UTF-8 в ANSI и обратно: есть ли стандартный способ?

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

Перевод UTF-8 в ANSI и обратно: есть ли стандартный способ?

Сообщение arthur2 » 27.03.2008 (Чт) 23:02

Итак, нужно перевести строку из UTF-8 в ANSI и обратно. Есть ли для этого стандартный способ (Апи какая-нибудь - система же как-то переводит), или придётся переводить руками?

Если придётся руками, то какой алгоритм перевода и как вообще определить, в какой кодировке строка?

Gloom
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 200
Зарегистрирован: 23.11.2004 (Вт) 15:57
Откуда: СПб

Сообщение Gloom » 27.03.2008 (Чт) 23:44


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

Сообщение arthur2 » 28.03.2008 (Пт) 10:41

Gloom
Спасибо! Да, это то, что нужно.

На другом форуме подсказали рабочий кусок кода (правда, пришлось немного подстрогать :)
Код: Выделить всё
'Private Declare Function LocalAlloc Lib "kernel32.dll" (ByVal wFlags As Long, ByVal wBytes As Long) As Long
'Private Declare Function LocalFree Lib "kernel32.dll" (ByVal hMem As Long) As Long
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
'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
'Private Const LMEM_ZEROINIT As Long = &H40


Public Function UTF8ToWin(ByVal inString As String) As String
        Dim hMemLock1   As Long, hMemLock2  As Long
        Dim iStrSize    As Long, lMaxSize As Long, str1 As String, str2 As String
     ' судя по описанию функции, строка должна быть NULL-terminated
        inString = inString & vbNullChar '& vbNullChar
     'Но всё работает и без этого :) Оставил на всякий пожарный
       
        lMaxSize = Len(inString)
        str1 = String$(lMaxSize, 0&)
        str2 = String$(lMaxSize, 0&)
        hMemLock1 = StrPtr(str1)
        hMemLock2 = StrPtr(str2)
       
'        hMemLock1 = LocalAlloc(LMEM_ZEROINIT, lMaxSize)' при этом способе бейсик иногда падал
'        hMemLock2 = LocalAlloc(LMEM_ZEROINIT, lMaxSize)


        iStrSize = MultiByteToWideChar(CP_UTF8, 0&, inString, &HFFFF, hMemLock1, lMaxSize)
        iStrSize = WideCharToMultiByte(0&, 0&, hMemLock1, &HFFFF, hMemLock2, iStrSize, 0&, 0&)

        If Len(iStrSize) Then
        UTF8ToWin = StrConv(str2, vbUnicode)
'            UTF8ToWin = String$(iStrSize, 0&)
'            Call CopyMemory(ByVal UTF8ToWin, ByVal hMemLock2, iStrSize)
        End If

'        Call LocalFree(hMemLock1)
'        Call LocalFree(hMemLock2)
End Function



Пример использования:
instring="<B>Превед, </B> <A title=""Превед, медвед"" Style = ""TEXT-DECORATION: underline"" onclick=""link_to_post(1912827); return false;"" href=""#"">медвед</A>"

outstring=UTF8ToWin(instring, Len(instring))
Последний раз редактировалось arthur2 13.03.2009 (Пт) 14:39, всего редактировалось 1 раз.

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

Сообщение arthur2 » 28.03.2008 (Пт) 12:40

Написал пример, как получить перетаскиванием фрагмент страницы хтмл.

Код функции UTF8ToWin пришлось немного подстрогать - а то бейски иногда падал.
Вложения
fragment HTML OLE.zip
Как перетаскиванием получить фрагмент html
(5.12 Кб) Скачиваний: 195
Артур
 
   

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

Сообщение arthur2 » 08.05.2008 (Чт) 11:02

И ведь никто не заметил ошибки. Или не счёл нужным о ней сказать.

Оказывается, число, которое я нашёл методом тыка, описывающее формат буфера HTML Format, может меняться! Так что мой код мог работать, а мог и не работать.

Чило нужно было получать через RegisterClipboardFormat("HTML Format")

Пример исправил.
Артур
 
   


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

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

Сейчас этот форум просматривают: AhrefsBot и гости: 13

    TopList