Форум программистов, компьютерный форум, киберфорум
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. Показов 1056. Ответов 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
1387 / 843 / 92
Регистрация: 08.02.2017
Сообщений: 3,593
Записей в блоге: 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
1387 / 843 / 92
Регистрация: 08.02.2017
Сообщений: 3,593
Записей в блоге: 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
1387 / 843 / 92
Регистрация: 08.02.2017
Сообщений: 3,593
Записей в блоге: 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
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru