powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / vb 6.0 преобразовать строку utf-16 -> utf-8 с помошью WINAPI
3 сообщений из 3, страница 1 из 1
vb 6.0 преобразовать строку utf-16 -> utf-8 с помошью WINAPI
    #37199666
Stupid_BOT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго всем здоровья настроения.

Хочется сабжу, а не получается.
Код
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
' **********************************************************
' module kernel32.dll
' ref http://msdn.microsoft.com/en-us/library/dd374130%28v=vs.85%29.aspx
'int WideCharToMultiByte(
'  __in   UINT CodePage,
'  __in   DWORD dwFlags,
'  __in   LPCWSTR lpWideCharStr,
'  __in   int cchWideChar,
'  __out  LPSTR lpMultiByteStr,
'  __in   int cbMultiByte,
'  __in   LPCSTR lpDefaultChar,
'  __out  LPBOOL lpUsedDefaultChar
');
Declare Function toMultiByte Lib "kernel32" _
Alias "WideCharToMultiByte" ( _
                CodePage&, _
		dwFlags%, _
		lpWideCharStr&, _
		cchWideChar&, _
                lpMultiByteStr&, _
		cbMultiByte&, _
		lpDefaultChar&, _
		lpUsedDefaultChar& _
		) As Long

' **********************************************************
' module kernel32.dll
' ref http://msdn.microsoft.com/en-us/library/ms679360%28v=vs.85%29.aspx
'DWORD WINAPI GetLastError(void);
Declare Function APILastError Lib "kernel32" Alias "GetLastError" () As Integer
				
Sub GetUTFString()
Const CP_UTF8& =  65001 
Const WC_ERR_INVALID_CHARS% = &H80
Dim lBuf&, lReslt&, sUTF8$, sUTF16$
    sUTF16 = "I know kungfu!(c)"

    ' получить размер буфера под utf8 строку
    lBuf = toMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, StrPtr(sUTF16 & vbNullChar), - 1 ,  0 ,  0 ,  0 ,  0 )
' пробовал явно указывать длину строки, - результат аналогичный
'Dim lLen&
'lLen = Len(sUTF16)
'lBuf = toMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, StrPtr(sUTF16 & vbNullChar), lLen + 1, 0, 0, 0, 0)
    If lBuf =  0  Then
        Debug.Print "toMB APILastEror: "; APILastError
    End If

    ' преобразовать utf16 в utf8
    lResult = toMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, StrPtr(sUTF16 & vbNullChar), - 1 , StrPtr(sUTF8), lBuf,  0 ,  0 ) 
'lResult = toMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, StrPtr(sUTF16 & vbNullChar), lLen + 1, StrPtr(sUTF8), lBuf, 0, 0)
End Sub
Отрабатывает без ошибок, но считает, что под utf8 строку достаточно нулевого буфера :)
В итоге получаю вместо вожделенного пустую строку...
Подскажите направление обхода этих граблей(?).
ЗЫ: про ADODB.Stream в курсе, но если есть возможность без него - то лучше без.

---------------------------------
Зри в корень! (с) Козьма Прутков
...
Рейтинг: 0 / 0
vb 6.0 преобразовать строку utf-16 -> utf-8 с помошью WINAPI
    #37199706
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
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
...
Рейтинг: 0 / 0
vb 6.0 преобразовать строку utf-16 -> utf-8 с помошью WINAPI
    #37199804
Stupid_BOT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_One,
спасибо. Разбираться буду вечером. Сейчас работать надо :)
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / vb 6.0 преобразовать строку utf-16 -> utf-8 с помошью WINAPI
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]