Visual Basic cp1251 в utf8

Возникла у меня необходимость в моем Microsoft Access файле сделать перекодирование текста из cp1251 в UTF8 — а именно необходимо было перейти к странице в интернете, но при передаче запроса мои вставляемые данные были в кодировке cp1251, а сам сайт в UTF8. Т.е. есть сайт example.com и необходимо попасть на страницу example.com/index?confirm=Привет — так вот привет вставлялся мною. Как обычно из кучи примеров только один заработал — делюсь

'Это в самое начало
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


'Функция перевода cp1251 в utf8
Private Function WinToUTF8(ByRef inString As String, ByVal lMaxSize As Long) As String
Dim hMemLock1 As Long, hMemLock2 As Long
Dim iStrSize As Long
hMemLock1 = LocalAlloc(LMEM_ZEROINIT, lMaxSize)
hMemLock2 = LocalAlloc(LMEM_ZEROINIT, lMaxSize)
iStrSize = MultiByteToWideChar(0&, 0&, inString, &HFFFF, hMemLock1, lMaxSize)
iStrSize = WideCharToMultiByte(65001, 0&, hMemLock1, iStrSize, hMemLock2, lMaxSize, 0&, 0&) ' CP_UTF8
If Len(iStrSize) Then
WinToUTF8 = String$(iStrSize, 0&)
Call CopyMemory(ByVal WinToUTF8, ByVal hMemLock2, iStrSize)
End If
Call LocalFree(hMemLock1)
Call LocalFree(hMemLock2)
End Function


'далее использование где 20 максимальная длина
WinToUTF8(text, 20)

2 комментария к записи “Visual Basic cp1251 в utf8”

  1. Андрей:

    Большое спасибо

  2. Андрей:

    Для надежности дописал код
    Public Function WinToUTF8TXT(Txt As Variant) As String
    If Txt & «» = «» Then Exit Function
    Dim i As Long, s As String, Tmp As String
    Tmp = Txt
    i = (Len(Tmp) + 1) * 2
    s = WinToUTF8(Tmp, i)
    s = Left(s, Len(Tmp) * 2)
    WinToUTF8TXT = s
    End Function

    Придется меньше думать о длине ByVal lMaxSize As Long, а также есть моменты когда в код попали символы chr(0) в конце, так как для вывода одного символа нужно было вписать lMaxSize =3 вместо 2, для надежности 4 пишу (на 2 больше -> (Len(Tmp) + 1) * 2) иначе почему-то не работает. Так как код WinToUTF8 не мой, то с «почему-то» борюсь просто s = Left(s, Len(Tmp) * 2), так как знаю что код может увеличится в 2 раза (не больше). Работает стабильно. На больших текстах не пробовал, но строчки If Txt & «» = «» Then Exit Function использовал из-за предосторожности, так как Txt может быть Null потому как читаю с базы данных данные поля, а сама функция WinToUTF8TXT капризна из-за использования Declare Function…. которые в случай что не так вырубают VB6 полностью с процеса.

Прокомментировать

XHTML: Вы можете использовать эти тэги для форматирования текста: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>