Конвертирование строки из КОИ-8 в cp1251 и обратно
Кодировка KOI8-R
КОИ-8 - код обмена информацией - восьмибитовая кодовая страница, разработанная для кодирования букв кириллических алфавитов. КОИ-8 в свое время была широко распространена как основная русская кодировка в UNIX-совместимых ОС и в электронной почте. Существует несколько вариантов КОИ-8, в этой статье я расскажу, как можно конвертировать строку из KOI8-R (русская) в стандартную виндовую кодировку cp1251 и обратно.
Для конвертирования текста используются таблицы замены символов. В зависимости от направления перекодирования ищется символ в нужной таблице, затем, в случае успешного поиска, по его индексу извлекается соответствующий символ из другой таблицы. Все прочие символы остаются без изменений.
Code (Assembler) : Убрать нумерацию
- koi8 db 'T', 'Ё', 'ё', 'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ж'
- db 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р'
- db 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ'
- db 'Ы', 'Ь', 'Э', 'Ю', 'Я', 'а', 'б', 'в', 'г', 'д'
- db 'е', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о'
- db 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш'
- db 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я'
- table_len = $-koi8
- cp1251 db 'ё', 'Ё', 'T', 'ю', 'а', 'б', 'ц', 'д', 'е', 'ф'
- db 'г', 'х', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п'
- db 'я', 'р', 'с', 'т', 'у', 'ж', 'в', 'ь', 'ы', 'з'
- db 'ш', 'э', 'щ', 'ч', 'ъ', 'Ю', 'А', 'Б', 'Ц', 'Д'
- db 'Е', 'Ф', 'Г', 'Х', 'И', 'Й', 'К', 'Л', 'М', 'Н'
- db 'О', 'П', 'Я', 'Р', 'С', 'Т', 'У', 'Ж', 'В', 'Ь'
- db 'Ы', 'З', 'Ш', 'Э', 'Щ', 'Ч', 'Ъ'
Code (Assembler) : Убрать нумерацию
- ;----------------------------------------------------
- ; Конвертирование строки из КОИ-8 в cp1251
- ;----------------------------------------------------
- mov esi,buff ; Исходная строка
- mov edi,result ; Результат
- .loc_loop:
- lodsb
- ; Строка закончилась?
- or al,al
- jz .loc_done
- mov ecx,table_len
- push edi
- mov edi,koi8
- repne scasb
- pop edi
- or ecx,ecx
- jnz @f
- stosb
- jmp .loc_loop
- @@:
- mov eax,table_len-1
- sub eax,ecx
- mov al,[cp1251+eax]
- stosb
- jmp .loc_loop
- .loc_done:
- xor eax,eax
- stosb
Code (Assembler) : Убрать нумерацию
- ;----------------------------------------------------
- ; Конвертирование строки из cp1251 в КОИ-8
- ;----------------------------------------------------
- mov esi,buff ; Исходная строка
- mov edi,result ; Результат
- .loc_loop:
- lodsb
- ; Строка закончилась?
- or al,al
- jz .loc_done
- mov ecx,table_len
- push edi
- mov edi,cp1251
- repne scasb
- pop edi
- or ecx,ecx
- jnz @f
- stosb
- jmp .loc_loop
- @@:
- mov eax,table_len-1
- sub eax,ecx
- mov al,[koi8+eax]
- stosb
- jmp .loc_loop
- .loc_done:
- xor eax,eax
- stosb
Просмотров: 1452 | Комментариев: 2
Метки: Assembler, полезные функции
Комментарии
Отзывы посетителей сайта о статье
NetR00ver
(07.11.2023 в 12:41):
не думал, что эта тема до сих пор актуальна) 0_о
Добавить комментарий
Заполните форму для добавления комментария
Вот довольно древняя утилитка, для DOS, которая этим заимается.
У меня было настроено меню в VolkovCommander'е для перекодировок файлов.
Надо будет перетащить её в WIN32, если получится
http://old-dos.ru/index.php?pa...show&id=3234