Public Function ConvertFromUTF8(InBuf As String) As String
ConvertFromUTF8 = ConvertCharset(InBuf, CS_UTF8, CS_Windows)
End Function
Public Function ConvertCharset(ByVal strString As String, ByVal FromCharset As CHARSET, ByVal ToCharset As CHARSET) As String
Dim lngLength As Long
Dim strWideChar As String
Dim strReturn As String
Dim lngReturnLength As Long
Dim dwFlags As Long
If FromCharset = CS_UTF7 Or FromCharset = CS_UTF8 Then
dwFlags = 0
Else
dwFlags = MB_PRECOMPOSED
End If
lngLength = Len(strString)
strWideChar = String$(lngLength * 2, Chr$(0))
strReturn = String$(lngLength * 2, Chr$(0))
lngReturnLength = MultiByteToWideChar(FromCharset, dwFlags, strString, lngLength, strWideChar, lngLength)
WideCharToMultiByte ToCharset, 0, strWideChar, lngReturnLength, strReturn, lngLength * 2, ByVal 0, 0
ConvertCharset = Left$(strReturn, lngReturnLength)
End Function
'
' вызов в коде некоей формы:
'
Text2.Text = ConvertFromUTF8(Text1.Text)
'
' (в Text1 вставляю текст, скопированный из пришедшего мне эл. письма в UTF-8 формате)
'
Работает, но самую первую букву просто отрубает!
Просидел час в Гугле, нашёл "похожие" коды. Скачал. Везде та же самая проблема (для некоторых строк и соответственно некоторых начальных букв). В чём м.б. дело?!
То же самое письмо службой Mail.Ru и программкой "Штирлиц" конвертируется корректно. Т.е. явно проблема в моём коде. Никто не владеет данной темой?
PS: вот точный заголовок "части" этого multipart-сообщения, в которой и содержится закодированный текст:
' §§§§§§§§§§§§§§§§§§§§§§§§§§ APIs §§§§§§§§§§§§§§§§§§§§§§§§§§
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)
'--------------------------------------------------------------------------------
' Проект : OfflineClient
' Процедура : UTF8ToWin
' Описание : Перевод UTF8 строки в WIN кодировку
' Кем создан : SNE
' Дата-Время : 09.11.2004-11:56:58
'
' Параметры : inString - Строка в utf8 кодировке
' lMaxSize - Максимальный размер строки
'--------------------------------------------------------------------------------
Private Function UTF8ToWin(ByRef inString As String, _
ByVal lMaxSize As Long) As String
If inString = vbNullString Then Exit Function
Dim hMemLock1 As Long, hMemLock2 As Long
Dim iStrSize As Long
У меня ни тот, ни тот код не работает. Первый выдает ошибку на строчке
lngReturnLength = MultiByteToWideChar(FromCharset, dwFlags, strString, lngLength, strWideChar, lngLength)
Вторая просто ничего не изменяет. Какой текст был таким и остался.