Blog. Just Blog

Конвертирование строки из КОИ-8 в cp1251 и обратно

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Кодировка KOI8-R
Кодировка KOI8-R

КОИ-8 - код обмена информацией - восьмибитовая кодовая страница, разработанная для кодирования букв кириллических алфавитов. КОИ-8 в свое время была широко распространена как основная русская кодировка в UNIX-совместимых ОС и в электронной почте. Существует несколько вариантов КОИ-8, в этой статье я расскажу, как можно конвертировать строку из KOI8-R (русская) в стандартную виндовую кодировку cp1251 и обратно.

Для конвертирования текста используются таблицы замены символов. В зависимости от направления перекодирования ищется символ в нужной таблице, затем, в случае успешного поиска, по его индексу извлекается соответствующий символ из другой таблицы. Все прочие символы остаются без изменений.
  1. koi8    db      'T', 'Ё', 'ё', 'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ж'
  2.         db      'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р'
  3.         db      'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ'
  4.         db      'Ы', 'Ь', 'Э', 'Ю', 'Я', 'а', 'б', 'в', 'г', 'д'
  5.         db      'е', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о'
  6.         db      'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш'
  7.         db      'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я'
  8. table_len = $-koi8
  9.  
  10. cp1251  db      'ё', 'Ё', 'T', 'ю', 'а', 'б', 'ц', 'д', 'е', 'ф'
  11.         db      'г', 'х', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п'
  12.         db      'я', 'р', 'с', 'т', 'у', 'ж', 'в', 'ь', 'ы', 'з'
  13.         db      'ш', 'э', 'щ', 'ч', 'ъ', 'Ю', 'А', 'Б', 'Ц', 'Д'
  14.         db      'Е', 'Ф', 'Г', 'Х', 'И', 'Й', 'К', 'Л', 'М', 'Н'
  15.         db      'О', 'П', 'Я', 'Р', 'С', 'Т', 'У', 'Ж', 'В', 'Ь'
  16.         db      'Ы', 'З', 'Ш', 'Э', 'Щ', 'Ч', 'Ъ'
Код для конвертирования текста из КОИ-8 в cp1251 и обратно очень похож, различия только в таблице, используемой для поиска и замены символов.
  1.         ;----------------------------------------------------
  2.         ; Конвертирование строки из КОИ-8 в cp1251
  3.         ;----------------------------------------------------
  4.  
  5.         mov     esi,buff    ; Исходная строка
  6.         mov     edi,result  ; Результат
  7. .loc_loop:
  8.         lodsb
  9.         ; Строка закончилась?
  10.         or      al,al
  11.         jz      .loc_done
  12.  
  13.         mov     ecx,table_len
  14.         push    edi
  15.         mov     edi,koi8
  16.         repne   scasb
  17.         pop     edi
  18.         or      ecx,ecx
  19.         jnz     @f
  20.         stosb
  21.         jmp     .loc_loop
  22. @@:
  23.         mov     eax,table_len-1
  24.         sub     eax,ecx
  25.         mov     al,[cp1251+eax]
  26.         stosb
  27.         jmp     .loc_loop
  28.  
  29. .loc_done:
  30.         xor     eax,eax
  31.         stosb
  1.         ;----------------------------------------------------
  2.         ; Конвертирование строки из cp1251 в КОИ-8
  3.         ;----------------------------------------------------
  4.  
  5.         mov     esi,buff    ; Исходная строка
  6.         mov     edi,result  ; Результат
  7. .loc_loop:
  8.         lodsb
  9.         ; Строка закончилась?
  10.         or      al,al
  11.         jz      .loc_done
  12.  
  13.         mov     ecx,table_len
  14.         push    edi
  15.         mov     edi,cp1251
  16.         repne   scasb
  17.         pop     edi
  18.         or      ecx,ecx
  19.         jnz     @f
  20.         stosb
  21.         jmp     .loc_loop
  22. @@:
  23.         mov     eax,table_len-1
  24.         sub     eax,ecx
  25.         mov     al,[koi8+eax]
  26.         stosb
  27.         jmp     .loc_loop
  28.  
  29. .loc_done:
  30.         xor     eax,eax
  31.         stosb
В приложении примеры программ с исходными текстами, конвертирующие текстовую строку из кодировки КОИ-8 в cp1251 и обратно.

Примеры программ с исходными текстами (FASM)Примеры программ с исходными текстами (FASM)

KOI8.cp1251.Demo.zip (5,332 bytes)


Поделиться ссылкой ВКонтакте
Просмотров: 1452 | Комментариев: 2

Комментарии

Отзывы посетителей сайта о статье
user (22.12.2023 в 06:47):
Односимвольные перекодировки проще делать с помощью 256-байтных таблиц.
Вот довольно древняя утилитка, для DOS, которая этим заимается.
У меня было настроено меню в VolkovCommander'е для перекодировок файлов.
Надо будет перетащить её в WIN32, если получится
http://old-dos.ru/index.php?pa...show&id=3234
NetR00ver (07.11.2023 в 12:41):
не думал, что эта тема до сих пор актуальна) 0_о

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 2 (0.0041 сек.) / Память: 4.5 Mb
Наверх