С Новым годом! Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
63 / 48 / 12
Регистрация: 28.12.2014
Сообщений: 270

Перекодировка в UTF-8 в VB6.0 средствами MultiByteToWideChar

07.04.2024, 16:43. Показов 957. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Подскажите, пожалуйста, в чем может быть проблема при перекодировке в UTF-8 с использованием функции win API MultiByteToWideChar. В зависимости от версии операционной системы при использовании данной функции получается разный результат, который не получается назвать соответствующим кодировке UTF-8. При этом в операционной системе используется кодовая страница 1251, локаль вызывающего потока 1049 он же LCID. Текст программы:
Кликните здесь для просмотра всего текста

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Option Explicit
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 Const CP_THREAD_ACP     As Long = 3&           'current thread's ANSI code page
Private Const CP_UTF8           As Long = 65001            'UTF-8 translation
Public Sub Main()
    Dim strString As String, lngRetval As Long
    Dim bytBuff(255&) As Byte, fbytBuff(100) As Byte
    fbytBuff(0) = 200
    fbytBuff(1) = 0
    fbytBuff(2) = 0
    lngRetval = MultiByteToWideChar(CP_UTF8, 0&, VarPtr(fbytBuff(0)), 2, VarPtr(bytBuff(0)), 255 \ 2)
End Sub


Результат работы функции MultiByteToWideChar - 2 байта записаны в выходном буфере, значение первого байта 253, второго 255. Система счисления десятеричная или &HFD, &HFF.

Спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.04.2024, 16:43
Ответы с готовыми решениями:

Перекодировка ANSI в utf-8
помогите пожалуйста с программой... Имеется Текстовый файл в кодировке Windows 1251(ansi) - необходимо перекодировать в utf8 и сохранить в...

Перекодировка из UTF-8 в KOI8
Проблема... Нигде не нашел... Сервис на меня отправляет постом сообщение в UTF8 Мне его нужно залить в PgSQL - KOI8 Кто-нибудь...

Перекодировка UTF в кириллицу
Подскажите, пожалуйста, есть ли стандартные функции для перекодировки UTF в WIN1251 в javascript или как это можно реализовать? По интернет...

10
1382 / 838 / 89
Регистрация: 08.02.2017
Сообщений: 3,510
Записей в блоге: 1
07.04.2024, 18:47
IDK, здравствуйте. Судя по таблицам такого кода 200(c8) в кодировке Utf-8 вроде бы нет, но я не специалист конечно
Цитата Сообщение от IDK Посмотреть сообщение
получается разный результат, который не получается назвать соответствующим кодировке UTF-8
Какой на ваш взгляд должен быть результат?
1
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
07.04.2024, 20:42
Запись BOM в кодировке UTF-8 должна начинаться с байтов EF BB BF

Добавлено через 3 минуты
Цитата Сообщение от testuser2 Посмотреть сообщение
Какой на ваш взгляд должен быть результат?
Полностью согласен, слишком мало информации предоставлено. Нет даже никаких объяснений в каких ОС и какой результат... И очень мало кода

Добавлено через 43 секунды
IDK, код который вы предоставили не полный

Добавлено через 10 минут
Цитата Сообщение от IDK Посмотреть сообщение
255 \ 2)
255 / 2 это уже неправильный код кстати
0
63 / 48 / 12
Регистрация: 28.12.2014
Сообщений: 270
08.04.2024, 03:03  [ТС]
Цитата Сообщение от testuser2 Посмотреть сообщение
Какой на ваш взгляд должен быть результат?
UTF-8 Unicode Character 'CYRILLIC CAPITAL LETTER I' (U+0418) - &H418, b10000011000.
https://www.fileformat.info/in... /index.htm

Добавлено через 3 минуты
Цитата Сообщение от HackerVlad Посмотреть сообщение
Запись BOM в кодировке UTF-8 должна начинаться с байтов EF BB BF
Необязательная сигнатура, которая не соответствует выходному буферу из MultiByteToWideChar.

Цитата Сообщение от HackerVlad Посмотреть сообщение
Полностью согласен, слишком мало информации предоставлено. Нет даже никаких объяснений в каких ОС и какой результат... И очень мало кода
Чего не хватает для достаточности кода?
Приведенный результат работы функции в первом сообщении для win8.1. Для win xp соответствующий результат- 1 байт записан в выходной буфер, значение байт в буфере после записи 0, 0.

Цитата Сообщение от HackerVlad Посмотреть сообщение
255 / 2 это уже неправильный код кстати
В чем?

Добавлено через 19 секунд
Цитата Сообщение от HackerVlad Посмотреть сообщение
Запись BOM в кодировке UTF-8 должна начинаться с байтов EF BB BF
Необязательная сигнатура, которая не соответствует выходному буферу из MultiByteToWideChar.

Цитата Сообщение от HackerVlad Посмотреть сообщение
Полностью согласен, слишком мало информации предоставлено. Нет даже никаких объяснений в каких ОС и какой результат... И очень мало кода
Чего не хватает для достаточности кода?
Приведенный результат работы функции в первом сообщении для win8.1. Для win xp соответствующий результат- 1 байт записан в выходной буфер, значение байт в буфере после записи 0, 0.

Цитата Сообщение от HackerVlad Посмотреть сообщение
255 / 2 это уже неправильный код кстати
В чем?
0
1382 / 838 / 89
Регистрация: 08.02.2017
Сообщений: 3,510
Записей в блоге: 1
08.04.2024, 07:57
IDK, я посмотрел, у вас ошибка вот в чем, 200 это 1байтный код Ansi для буквы "И", в Utf-8 это соответствует 2 байтам 203(D9), 152(98). Если с них конвертировать функцией MultiByteToWideChar, то результат будет правильным.
0
63 / 48 / 12
Регистрация: 28.12.2014
Сообщений: 270
08.04.2024, 08:14  [ТС]
Цитата Сообщение от testuser2 Посмотреть сообщение
IDK, я посмотрел, у вас ошибка вот в чем, 200 это 1байтный код Ansi для буквы "И", в Utf-8 это соответствует 2 байтам 203(D9), 152(98). Если с них конвертировать функцией MultiByteToWideChar, то результат будет правильным.
При этом что и куда конвертируется? Из какого формата в какой?

Ps Есть значение FFFD на которое заменяется символ, который нет возможности кодировать. И порядок байт, похоже, обратный. Т.е. будто бы кодировка идет в UTF-16.
0
1382 / 838 / 89
Регистрация: 08.02.2017
Сообщений: 3,510
Записей в блоге: 1
08.04.2024, 08:32
IDK, из Utf8 в Unicode. Но, да, я понял еще одну вещь вы хотите конвертировать наоборот в utf8, но для этого нужна др. функция WideChartoMultibyte

Добавлено через 12 минут
И в таком случае нужно опять же конвертировать не из Ansi, а из Юникода, т.е. код 200 не подойдет
1
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
08.04.2024, 13:25
testuser2 прав, я сразу этого не заметил просто. Функция MultiByteToWideChar используется для загрузки, а не сохранения. Для записи/сохранения и преобразования в результатирующею кодировку используется функция WideCharToMultiByte.

Добавлено через 2 минуты
IDK, ваш код изначально полностью неправильный
а неполный он потому что я не вижу продолжения. Я не вижу куда сохраняется массив данных UTF-8 и как он дальше используется.

Да и по регламенту функцию WideCharToMultiByte нужно вызывать дважды, первый раз для узнавания выходного буфера, второй раз для записи массива с уже известным количеством байтов.
1
63 / 48 / 12
Регистрация: 28.12.2014
Сообщений: 270
08.04.2024, 13:32  [ТС]
Цитата Сообщение от testuser2 Посмотреть сообщение
из Utf8 в Unicode.
Из UTF-8 в UTF-16.
Visual Basic
1
lngRetval = MultiByteToWideChar(CP_UTF8, 0&, VarPtr(fbytBuff(0)), 2, VarPtr(bytBuff(0)), 255 \ 2)
Цитата Сообщение от testuser2 Посмотреть сообщение
И в таком случае нужно опять же конвертировать не из Ansi, а из Юникода, т.е. код 200 не подойдет
Подойдет если: code page 1251 - UTF-16 с помощью MultiByteToWideChar, UTF-16 - UTF-8 с помощью WideCharToMultibyte.

Если передавать двухбайтную BSTR строку в WideCharToMultibyte:

Visual Basic
1
lngRetval = WideCharToMultiByte(CP_UTF8, 0&, StrPtr(strString), Len(strString), VarPtr(fbytBuff(0&)), Len(strString) * 2&, 0&, 0&)
То можно обойтись и без однобайтного представления строки.

Функция MultiByteToWideChar судя по декомпиляции не определяет code page операционной системы и не запрашивает LCID потока.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
08.04.2024, 14:22
Цитата Сообщение от IDK Посмотреть сообщение
В чем?
Я объяснил, что функцию нужно вызывать дважды. Сначала для узнавания выходного буфера, потом уже вызывать точно зная размер буфера.

Добавлено через 3 минуты
Забудьте вы уже про ANSI. В VB6 строки хранятся в UTF-16 LE

Добавлено через 45 минут
IDK, я же совсем недавно писал код, который работает, здесь на форуме в соседней теме:

Visual Basic
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
Option Explicit
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 cbMultiByte As Long, ByVal lpDefaultChar As Long, ByVal lpUsedDefaultChar As Long) As Long
Private Declare Function MultiByteToWideChar Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpMultiByteStr As Long, ByVal cbMultiByte As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long
Private Declare Function MessageBox Lib "user32" Alias "MessageBoxW" (ByVal hwnd As Long, ByVal lpText As Long, ByVal lpCaption As Long, ByVal wType As Long) As Long
Private Declare Function SysAllocStringByteLen Lib "oleaut32" (ByVal olestr As Long, ByVal BLen As Long) As Long
Private Declare Function SysAllocStringLen Lib "oleaut32" (ByVal olestr As Long, ByVal BLen As Long) As Long
Private Declare Sub PutMem4 Lib "msvbvm60" (ByVal Ptr As Long, ByVal Value As Long)
 
Private Const CP_UTF8 As Long = 65001
Dim strTXT As String
 
' Конвертировать любой текст в UTF-8
Private Function ConvertToUTF8(strText As String) As String
    Dim nOutputByteLen As Long
    Dim arr() As Byte
    
    If Len(strText) > 0 Then
        nOutputByteLen = WideCharToMultiByte(CP_UTF8, 0&, StrPtr(strText), Len(strText), 0&, 0&, 0&, 0&)
        
        If nOutputByteLen > 0 Then
            ReDim arr(nOutputByteLen - 1)
            WideCharToMultiByte CP_UTF8, 0&, StrPtr(strText), Len(strText), VarPtr(arr(0)), nOutputByteLen, 0&, 0&
            
            ConvertToUTF8 = arr
        End If
    End If
End Function
Источник: Изменить кодировку текста в поле Text1 на VB6
1
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
08.04.2024, 14:22
Цитата Сообщение от IDK Посмотреть сообщение
MultiByteToWideChar
Вообще-то UTF-8 многобайтовая. Эта функция может из UTF-8 в UTF-16 ковертировать. Для конвертирования в UTF-8 нужно использовать WideCharToMultiByte.
3
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.04.2024, 14:22
Помогаю со студенческими работами здесь

перекодировка из ANSI в UTF-8
Загрузил файл JS, в итоге модуль корзины стал отображаться с кракозябрами. Я так понимаю проблема в кодировке JS-скрипта? Пытался...

Перекодировка текста из CP1251 в UTF-8
Доброго, форумчане! средствами vbs читаю файл и меняю кодировку после чего передаю прочитанное в mathcad скрипт кнопки Sub...

Перекодировка с windows-1251 в utf-8
как можно написать процедуру на pl/sql, чтобы перекодировал с windows-1251 в utf-8 ?

Перекодировка ANSI -> UTF-8 программно.
Проблема: в VBA Excel создаю xml-файл. Файл создается в кодировке 1251. А нужен в UTF-8. Посоетуйте, плиз, как сделать программно: ...

Перекодировка из однобайтовой кодировки в UTF-16
Под виндой удобно чтобы кодировка самого perl-скрипта была CP1251. Но в самой винде есть утилита выдающая результат в кодировке...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru