Encoding KOI8-R

Тема в разделе "WASM.ASSEMBLER", создана пользователем Flasher, 21 июн 2006.

  1. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Гугль ничего дельного не сказал, вот и придётся задать глупый вопрос.

    Как перевести из KOI8-R на чуловеческий язык, или хотяб на windows-1251 ? (программно конечно)

    Спасибо!
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Что такое в вашем понимании
    и что
    ?


    Код (Text):
    1. WCHAR wStr[128];
    2. char *pch = ptrToMyFuckingkoi8rString;
    3. int pchsize = (int)strlen(pch);
    4. MultiByteToWideChar(0x5182, 0, pch, pchsize+1,  wStr, 128);
    5. WideCharToMultiByte(1251, 0, wStr, 128, pch, pchsize+1, NULL, NULL);


    Или тут
     
  3. ava

    ava New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2003
    Сообщения:
    169
    Самый правильный алгоритм перекодировки такой:



    1. Ищем в Сети (или где-нибудь еще) описания требуемых кодовых страниц. Составляем таблицы кодов UTF-32 для символов 80h-FFh (128 двойных слов).

    2. Берем таблицы для исходной и конечной кодовых страниц. Составляем таблицу перекодировки (256 байт).

    3. Перекодируем текст обычным XLAT-ом.



    Какой из шагов вызывает затруднения?
     
  4. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    ava, все 3 для меня как тёмный лес :)

    mail-check'ер пишу, там чистенько koi8 встречается, в принцапи вариант IceStudent меня устраивает, токо надо ещё сделать код рабочим :)


    Код (Text):
    1. .data
    2. pch db "7eX04ezs7/Dy7+vh9A==",0
    3. wStr db 128 dup(0)
    4. pchsize dd ?
    5.  
    6. .code
    7. start:
    8. invoke lstrlen,addr pch
    9. mov pchsize,eax
    10. invoke MultiByteToWideChar,5182,0,addr pch,pchsize+1,addr wStr,128
    11. invoke WideCharToMultiByte,1251,0,addr wStr,128,addr pch,pchsize+1,NULL,NULL
    12. invoke MessageBox,0,addr wStr,addr pch,0
    13. invoke ExitProcess,0
    14. end start
    15.  


    Что тут не правильно?

    Кстати, откуда 5182 ?


    Код (Text):
    1. CP_KOI8R 20866
    2. CP_KOI8U 21866


    При этих значениях тож борода.
     
  5. Spiteful

    Spiteful New Member

    Публикаций:
    0
    Регистрация:
    24 янв 2004
    Сообщения:
    33
    хм, "7eX04ezs7/Dy7+vh9A==", необычный метод перекодирования из base64...
     
  6. ssx

    ssx Member

    Публикаций:
    0
    Регистрация:
    19 авг 2003
    Сообщения:
    336


    МЕТАЛЛОПРОКАТ :)
     
  7. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Flasher

    Да, 20866. Только не используй статический буфер для перекодировки, а выделяй под него память. Потом, "7eX..." - это же base64.
     
  8. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Спасибо всем, кто откликнулся!

    Всё прекрасно работает, кстати, в после долгих истерзаний гугля нашёл вот ещё что, как раз про это и говорил ava.


    Код (Text):
    1. .data
    2. k2w_tbl db 16 dup(0)
    3.         db 16 dup(0)
    4.         db 00h,00h,00h,38h,00h,00h,00h,00h
    5.         db 00h,00h,00h,00h,00h,00h,00h,00h
    6.         db 00h,00h,00h,28h,00h,00h,00h,00h
    7.         db 00h,00h,00h,00h,00h,00h,00h,00h
    8.         db 7Eh,60h,61h,76h,64h,65h,74h,63h
    9.         db 75h,68h,69h,6Ah,6Bh,6Ch,6Dh,6Eh
    10.         db 6Fh,7Fh,70h,71h,72h,73h,66h,62h
    11.         db 7Ch,7Bh,67h,78h,7Dh,79h,77h,7Ah
    12.         db 5Eh,40h,41h,56h,44h,45h,54h,43h
    13.         db 55h,48h,49h,4Ah,4Bh,4Ch,4Dh,4Eh
    14.         db 4Fh,5Fh,50h,51h,52h,53h,46h,42h
    15.         db 5Ch,5Bh,47h,58h,5Dh,59h,57h,5Ah
    16. .code
    17. koi2wins proc
    18.        push esi
    19.        push edi
    20.        push ebx
    21.        mov esi,eax
    22.        mov edi,eax
    23.        mov ebx,offset k2w_tbl
    24. decode_string:
    25.        lodsb
    26.        test al,80h
    27.        jz dont_decode2
    28.        sub al,80h
    29.        xlat
    30.        add al,80h
    31. dont_decode2:
    32.        stosb
    33.        test al,al
    34.        jnz decode_string
    35.        pop ebx
    36.        pop edi
    37.        pop esi
    38.        ret
    39. koi2wins endp
    40. start:
    41. mov eax,offset string
    42. call koi2wins
    43.