Форум программистов, компьютерный форум, киберфорум
Pure Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 Аватар для winkot
0 / 0 / 0
Регистрация: 26.10.2024
Сообщений: 70

Конвертировать из OEM в UTF 8

11.02.2025, 09:56. Показов 1611. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как на PureBasic конвертировать файл из OEM866 в UTF-8?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.02.2025, 09:56
Ответы с готовыми решениями:

Формат кириллицы в UTF-8
Подскажите, как русский текст (кириллицу) отформатировать в UTF-8 и записать в файл?

Найти файл по имени в visual basic если он создан в формате utf-8
Здравствуйте. Такая ситуация – создается отчет из программы sppa t-3000 в формате utf-8 как файл csv. В программе требуется организовать...

IIS + CGI + Visual Basic = стучимся об UTF?
Такая проблема: Сделал CGI на Visual Basicе - принимает некое слово из веб-формы и тут же выдает его обратно. Эдакий примерчик для...

4
Эксперт по электронике
6493 / 3123 / 331
Регистрация: 28.10.2011
Сообщений: 12,277
Записей в блоге: 7
12.02.2025, 17:26
В OEM866 не так много символов. Можно написать таблицу преобразования.
Или функцией OemToChar() преобразовать в ascii / юникод и после функцией PokeS() или UTF8() преобразовать в UTF-8.
Или воспользоваться функцией MultiByteToWideChar().
0
62 / 60 / 3
Регистрация: 06.11.2010
Сообщений: 184
Записей в блоге: 1
17.02.2025, 11:55
PureBasic
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
Import "user32.lib"
    OemToCharBuffA(*Buff, *Buff1, SizeBuff)
    CharToOemBuffA(*Buff, *Buff1, SizeBuff)
EndImport
 
; 866 в Windows1251
Procedure.s ToChar(String$)
    Protected Ret$, *Buff, SizeBuff
    If Asc(String$)
        SizeBuff = Len(String$)
        *Buff = AllocateMemory(SizeBuff + 1)
        PokeS(*Buff, String$, SizeBuff, #PB_Ascii)
        OemToCharBuffA(*Buff, *Buff, SizeBuff) ; 866 в Windows1251
        Ret$ = PeekS(*Buff, SizeBuff, #PB_Ascii)
        FreeMemory(*Buff)
    EndIf
    ProcedureReturn Ret$
EndProcedure
 
; Windows1251 в 866
Procedure.s ToOem(String$)
    Protected Ret$, *Buff, SizeBuff
    If Asc(String$)
        SizeBuff = Len(String$)
        *Buff = AllocateMemory(SizeBuff + 1)
        PokeS(*Buff, String$, SizeBuff, #PB_Ascii)
        CharToOemBuffA(*Buff, *Buff, SizeBuff) ; Windows1251 в 866
        Ret$ = PeekS(*Buff, SizeBuff, #PB_Ascii)
        FreeMemory(*Buff)
    EndIf
    ProcedureReturn Ret$
EndProcedure
 
s.s = "Привет"
Debug s
s = ToOem(s)
Debug s
s = ToChar(s)
Debug s
Упрощение, так как с момента написания этих функций на 5.62 добавились функции Ascii()
PureBasic
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
Import "user32.lib"
    OemToCharBuffA(*Buff, *Buff1, SizeBuff)
    CharToOemBuffA(*Buff, *Buff1, SizeBuff)
EndImport
 
Procedure.s cp866_to_cp1251(String$)
    Protected *Buff
    If Asc(String$)
        *Buff = Ascii(String$)
        OemToCharBuffA(*Buff, *Buff, MemorySize(*Buff))
        String$ = PeekS(*Buff, MemorySize(*Buff), #PB_Ascii)
        FreeMemory(*Buff)
    EndIf
    ProcedureReturn String$
EndProcedure
 
Procedure.s cp1251_to_cp866(String$)
    Protected *Buff
    If Asc(String$)
        *Buff = Ascii(String$)
        CharToOemBuffA(*Buff, *Buff, MemorySize(*Buff))
        String$ = PeekS(*Buff, MemorySize(*Buff), #PB_Ascii)
        FreeMemory(*Buff)
    EndIf
    ProcedureReturn String$
EndProcedure
 
s.s = "Привет"
Debug s
s = cp1251_to_cp866(s)
Debug s
s = cp866_to_cp1251(s)
Debug s
1
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18234 / 14148 / 5366
Регистрация: 17.03.2014
Сообщений: 28,839
Записей в блоге: 1
23.02.2025, 15:53
AZJIO, ТС спрашивает про перевод из cp866 в UTF-8, а вы почему-то выложили код для windows-1251. Плюс OemToCharBuffA переводит в ANSI кодировку, которая не обязана быть конкретной кодировкой, а задается настройками системы. И наконец ТС спрашивал про перевод файла. На мой взгляд проще и эффективнее будет сделать как посоветовал locm и составить таблицу для 128 символов cp866 из второй половины. И далее читаем файл блоками в байтовый массив и выполняем перевод.
таблица
; 128 -> 208, 144
; 129 -> 208, 145
; 130 -> 208, 146
; 131 -> 208, 147
; 132 -> 208, 148
; 133 -> 208, 149
; 134 -> 208, 150
; 135 -> 208, 151
; 136 -> 208, 152
; 137 -> 208, 153
; 138 -> 208, 154
; 139 -> 208, 155
; 140 -> 208, 156
; 141 -> 208, 157
; 142 -> 208, 158
; 143 -> 208, 159
; 144 -> 208, 160
; 145 -> 208, 161
; 146 -> 208, 162
; 147 -> 208, 163
; 148 -> 208, 164
; 149 -> 208, 165
; 150 -> 208, 166
; 151 -> 208, 167
; 152 -> 208, 168
; 153 -> 208, 169
; 154 -> 208, 170
; 155 -> 208, 171
; 156 -> 208, 172
; 157 -> 208, 173
; 158 -> 208, 174
; 159 -> 208, 175
; 160 -> 208, 176
; 161 -> 208, 177
; 162 -> 208, 178
; 163 -> 208, 179
; 164 -> 208, 180
; 165 -> 208, 181
; 166 -> 208, 182
; 167 -> 208, 183
; 168 -> 208, 184
; 169 -> 208, 185
; 170 -> 208, 186
; 171 -> 208, 187
; 172 -> 208, 188
; 173 -> 208, 189
; 174 -> 208, 190
; 175 -> 208, 191
; 176 -> 226, 150, 145
; 177 -> 226, 150, 146
; 178 -> 226, 150, 147
; 179 -> 226, 148, 130
; 180 -> 226, 148, 164
; 181 -> 226, 149, 161
; 182 -> 226, 149, 162
; 183 -> 226, 149, 150
; 184 -> 226, 149, 149
; 185 -> 226, 149, 163
; 186 -> 226, 149, 145
; 187 -> 226, 149, 151
; 188 -> 226, 149, 157
; 189 -> 226, 149, 156
; 190 -> 226, 149, 155
; 191 -> 226, 148, 144
; 192 -> 226, 148, 148
; 193 -> 226, 148, 180
; 194 -> 226, 148, 172
; 195 -> 226, 148, 156
; 196 -> 226, 148, 128
; 197 -> 226, 148, 188
; 198 -> 226, 149, 158
; 199 -> 226, 149, 159
; 200 -> 226, 149, 154
; 201 -> 226, 149, 148
; 202 -> 226, 149, 169
; 203 -> 226, 149, 166
; 204 -> 226, 149, 160
; 205 -> 226, 149, 144
; 206 -> 226, 149, 172
; 207 -> 226, 149, 167
; 208 -> 226, 149, 168
; 209 -> 226, 149, 164
; 210 -> 226, 149, 165
; 211 -> 226, 149, 153
; 212 -> 226, 149, 152
; 213 -> 226, 149, 146
; 214 -> 226, 149, 147
; 215 -> 226, 149, 171
; 216 -> 226, 149, 170
; 217 -> 226, 148, 152
; 218 -> 226, 148, 140
; 219 -> 226, 150, 136
; 220 -> 226, 150, 132
; 221 -> 226, 150, 140
; 222 -> 226, 150, 144
; 223 -> 226, 150, 128
; 224 -> 209, 128
; 225 -> 209, 129
; 226 -> 209, 130
; 227 -> 209, 131
; 228 -> 209, 132
; 229 -> 209, 133
; 230 -> 209, 134
; 231 -> 209, 135
; 232 -> 209, 136
; 233 -> 209, 137
; 234 -> 209, 138
; 235 -> 209, 139
; 236 -> 209, 140
; 237 -> 209, 141
; 238 -> 209, 142
; 239 -> 209, 143
; 240 -> 208, 129
; 241 -> 209, 145
; 242 -> 208, 132
; 243 -> 209, 148
; 244 -> 208, 135
; 245 -> 209, 151
; 246 -> 208, 142
; 247 -> 209, 158
; 248 -> 194, 176
; 249 -> 226, 136, 153
; 250 -> 194, 183
; 251 -> 226, 136, 154
; 252 -> 226, 132, 150
; 253 -> 194, 164
; 254 -> 226, 150, 160
; 255 -> 194, 160
0
62 / 60 / 3
Регистрация: 06.11.2010
Сообщений: 184
Записей в блоге: 1
27.02.2025, 06:47
Цитата Сообщение от OwenGlendower Посмотреть сообщение
ТС спрашивает про перевод из cp866 в UTF-8
Дело в том что для cp1251 легко переводится в UTF-16 (именуемый юникодом в PureBasic, или точнее в UCS-2) с помощью чтения буфера функцией PeekS(), а уже потом переменную можно преобразовать в UTF-8 с помощью функции UTF8() при этом PureBasic не работает с переменной в UTF-8, так как все переменные находятся в формате UCS-2, в итоге UTF-8 мы можем получить только для сохранения файл в виде буфера памяти с указателем на него. Я не исключаю что можно написать функцию конвертирования cp866 сразу в указатель UTF-8, но я не уверен что автору это нужно, к тому же я дал рабочий вариант, а не мечты как это сделать и что это возможно. А функцию я использую для захвата данных cmd, которая даёт их в формате cp866 и если я после конвертирования получаю нормальный русский язык в гаджет (чего не будет в cp866), то задаче решена.

Цитата Сообщение от OwenGlendower Посмотреть сообщение
эффективнее будет сделать как посоветовал locm
Кстати, OemToChar() я не смог заставить работать (я проверял это до того как выложить свой пример). Меня заинтересовала возможность сделать функцией WinAPI без импорта, без строки Import "user32.lib", но я так и не смог заставить это работать. На счёт MultiByteToWideChar я не против, вы можете выложить пример, а не критиковать меня, у нас же здесь не обязаловка, чтобы я должен обеспечить самым современным и идеальным кодом всех просящих. Просто я пару лет назад хотел свои рабочие AutoIt3 примеры переписать на PureBasic и вымотался ничего не добившись, может я Ascii() не применил, как обычно одна запятая в коде и невозможность получить результат, а угадать методом тыка не получается. Поэтому я просто вытащил рабочий код и дал, не тратя время на вторую попытку.

PureBasic
1
2
3
4
5
6
7
String$ = "ЏаЁўҐв" ; строка, которая должна быть в 866, но кроме того она ещё и в UTF-16
*a = Ascii(String$) ; делаем буфер 866, хотя я был не уверен, по какой таблице он будет UTF-16 превращать в Ascii, ожидалось 1251
b$ = Space(Len(String$) * 2) ; создаём буфер для копирования, который должен быть минимум в 2 раза больше исходного в Ascii
MultiByteToWideChar_(866, 0, *a, MemorySize(*a), @b$, StringByteLength(b$)) ; преобразуем в UTF-16, опять же не UTF-8 как многие думают
FreeMemory(*a) ; освобождаем память
Debug b$       ; показываем что строка стала нормальной переменной в UTF-16
; *m = UTF8(b$) ; так мы получаем буфер UTF8 (не строку, не переменную)
А вот и функция.
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
EnableExplicit
 
Procedure.s WinAPI_MultiByteToWideChar(String$, CodePage)
    Protected *a, *m, Result$, size
    *a = Ascii(String$)
    size = MultiByteToWideChar_(CodePage, 0, *a, MemorySize(*a), 0, 0)
    If size
        *m = AllocateMemory(size)
        If *m
            If MultiByteToWideChar_(CodePage, 0, *a, MemorySize(*a), *m, size)
                Result$ = PeekS(*m)
            EndIf
            FreeMemory(*m)
        EndIf
    EndIf
    FreeMemory(*a)
    ProcedureReturn Result$
EndProcedure
 
Debug WinAPI_MultiByteToWideChar("ЏаЁўҐв", 866) ; 866
Debug WinAPI_MultiByteToWideChar("рТЙЧЕФ", 20866) ; KOI8
Debug WinAPI_MultiByteToWideChar("їаШТХв", 28595) ; ISO-8859-5
Debug WinAPI_MultiByteToWideChar("Привет", 65001) ; UTF8
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.02.2025, 06:47
Помогаю со студенческими работами здесь

Кто нибудь знает как конвертировать UTF-7 в Win и наоборот?
Есть ли у кого прога перекодировки из UTF-7 в Win и наоборот? У меня есть только описание самой кодировки UTF-7, но на английском. ...

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

Перекодировка строки win-1251 в кодировку utf-8
Помогите пожалуйста! есть проблема перекодировки строки win-1251 в кодировку utf-8. Может есть какие-нибудь стандартные модули для этих...

Конвертация из UTF-8 в Win1251 - А где решение?
Comanche, это хорошо, что ты разобрался, но ведь и другие хотели бы знать решение. В чем была проблема? Возможно, что ты не учитывал,...

Программа для конвертации русских символов в UTF-8
Здравствуйте! А есть у кого прога, которая конвертирует обыкновенные русские символы в кодировку UT-8?


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
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
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru