Utf8

Тема в разделе "WASM.BEGINNERS", создана пользователем alex_tg, 2 апр 2008.

  1. alex_tg

    alex_tg New Member

    Публикаций:
    0
    Регистрация:
    18 мар 2008
    Сообщения:
    15
    А не подскажет ли многоуважаемый All, как перекодировать Win1251 в Utf8?
    Было бы вообще замечательно, если бы ткнули носом в ASM - пример...
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Если winapi, то win1251 - utf16 - utf8. MultiByteToWideChar, WideCharToMultiByte. А так - см. описание utf8 и примеры здесь, на форуме.
     
  3. alex_tg

    alex_tg New Member

    Публикаций:
    0
    Регистрация:
    18 мар 2008
    Сообщения:
    15
    Я вот тут на форуме нашёл такое объяснение:

    D0B0-D0BF а-п
    D180-D18F р-я
    D090-D09F А-П
    D0A0-D0AF Р-Я
    Арглийские буквы ,цифры и знаки не изменяются.

    Если можно, поясните подробнее для тупых. Т.е. я могу взять 2 буфера buf1 для ascii и buf2 для utf8, и переписывать из 1 в 2 так, что если это английские и пр., то просто переписываю. А если скажем "п", то я в buf2 пишу не один, а 2 символа - 0d0h и 0bfh - так что ли? Или я не верно понял?
    И в каком порядке - какой байт старший, а какой младший? В DUMP должно выглядеть как D0 BF или как BF D0? (ну, может, тупость спросил - форум-то beginners... :) )
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Порядок задаётся BOM'ом, по умолчанию - нативный (то есть, LE), db D0,BF (но 0xBFD0).

    Да.
     
  5. Novi4ek

    Novi4ek New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2007
    Сообщения:
    317
    Вот давным давно писал на php его (просто демонстрация алго, код даже для пхп не оптимизирован):
    Код (Text):
    1. function utf8toUTF8($string){
    2.     $out = '';
    3.     for ($i = 0; $i<strlen($string); ++$i){
    4.         $ch = ord($string{$i});
    5.         if ($ch < 0x80)
    6.             $out .= chr($ch);
    7.         else
    8.             if($ch >= 0xC0)
    9.                 if($ch < 0xF0)
    10.                     $out .= "\xD0".chr(0x90 + $ch - 0xC0);
    11.                 else
    12.                     $out .= "\xD1".chr(0x80 + $ch - 0xF0);
    13.             else
    14.             switch($ch){
    15.                 case 0xA8: $out .= "\xD0\x81"; break;
    16.                 case 0xB8: $out .= "\xD1\x91"; break;
    17.                 case 0xA1: $out .= "\xD0\x8E"; break;
    18.                 case 0xA2: $out .= "\xD1\x9E"; break;
    19.                 case 0xAA: $out .= "\xD0\x84"; break;
    20.                 case 0xAF: $out .= "\xD0\x87"; break;
    21.                 case 0xB2: $out .= "\xD0\x86"; break;
    22.                 case 0xB3: $out .= "\xD1\x96"; break;
    23.                 case 0xBA: $out .= "\xD1\x94"; break;
    24.                 case 0xBF: $out .= "\xD1\x97"; break;
    25.                 case 0x8C: $out .= "\xD3\x90"; break;
    26.                 case 0x8D: $out .= "\xD3\x96"; break;
    27.                 case 0x8E: $out .= "\xD2\xAA"; break;
    28.                 case 0x8F: $out .= "\xD3\xB2"; break;
    29.                 case 0x9C: $out .= "\xD3\x91"; break;
    30.                 case 0x9D: $out .= "\xD3\x97"; break;
    31.                 case 0x9E: $out .= "\xD2\xAB"; break;
    32.                 case 0x9F: $out .= "\xD3\xB3"; break;
    33.             }
    34.     }
    35.     return $out;
    36. }
     
  6. alex_tg

    alex_tg New Member

    Публикаций:
    0
    Регистрация:
    18 мар 2008
    Сообщения:
    15
    В общем, сделал как-то так. Если кому интересно - проверяйте правильность (может где наглючил с таблицей. На первый взгляд вроде верно). Но толком не тестировал.

    Код (Text):
    1. Win1251ToUtf8   proc    uses ebx ecx edx esi edi Buf1251:dword,BufUtf8:dword,LenBuf1251:dword
    2. .data
    3.     utf8tab            db   0D0h,0,82h
    4.             db  0D0h,0,83h
    5.             db  0E2h,80h,9Ah
    6.             db  0D1h,0,93h
    7.             db  0E2h,80h,9Eh
    8.             db  0E2h,80h,0A6h
    9.             db  0E2h,80h,0A0h
    10.             db  0E2h,80h,0A1h
    11.             db  0E2h,82h,0ACh
    12.             db  0E2h,80h,0B0h
    13.             db  0D0h,0,89h
    14.             db  0E2h,80h,0B9h
    15.             db  0D0h,0,8Ah
    16.             db  0D0h,0,8Ch
    17.             db  0D0h,0,8Bh
    18.             db  0D0h,0,8Fh
    19.             db  0D1h,0,92h
    20.             db  0E2h,80h,98h
    21.             db  0E2h,80h,99h
    22.             db  0E2h,80h,9Ch
    23.             db  0E2h,80h,9Dh
    24.             db  0E2h,80h,0A2h
    25.             db  0E2h,80h,93h
    26.             db  0E2h,80h,94h
    27.             db  0C2h,0,98h
    28.             db  0E2h,84h,0A2h
    29.             db  0D1h,0,99h
    30.             db  0E2h,80h,0BAh
    31.             db  0D1h,0,9Ah
    32.             db  0D1h,0,9Ch
    33.             db  0D1h,0,9Bh
    34.             db  0D1h,0,9Fh
    35.             db  0C2h,0,0A0h
    36.             db  0D0h,0,8Eh
    37.             db  0D1h,0,9Eh
    38.             db  0D0h,0,88h
    39.             db  0C2h,0,0A4h
    40.             db  0D2h,0,90h
    41.             db  0C2h,0,0A6h
    42.             db  0C2h,0,0A7h
    43.             db  0D0h,0,81h
    44.             db  0C2h,0,0A9h
    45.             db  0D0h,0,84h
    46.             db  0C2h,0,0ABh
    47.             db  0C2h,0,0ACh
    48.             db  0C2h,0,0ADh
    49.             db  0C2h,0,0AEh
    50.             db  0D0h,0,87h
    51.             db  0C2h,0,0B0h
    52.             db  0C2h,0,0B1h
    53.             db  0D0h,0,86h
    54.             db  0D1h,0,96h
    55.             db  0D2h,0,91h
    56.             db  0C2h,0,0B5h
    57.             db  0C2h,0,0B6h
    58.             db  0C2h,0,0B7h
    59.             db  0D1h,0,91h
    60.             db  0E2h,84h,96h
    61.             db  0D1h,0,94h
    62.             db  0C2h,0,0BBh
    63.             db  0D1h,0,98h
    64.             db  0D0h,0,85h
    65.             db  0D1h,0,95h
    66.             db  0D1h,0,97h
    67.             db  0D0h,0,90h
    68.             db  0D0h,0,91h
    69.             db  0D0h,0,92h
    70.             db  0D0h,0,93h
    71.             db  0D0h,0,94h
    72.             db  0D0h,0,95h
    73.             db  0D0h,0,96h
    74.             db  0D0h,0,97h
    75.             db  0D0h,0,98h
    76.             db  0D0h,0,99h
    77.             db  0D0h,0,9Ah
    78.             db  0D0h,0,9Bh
    79.             db  0D0h,0,9Ch
    80.             db  0D0h,0,9Dh
    81.             db  0D0h,0,9Eh
    82.             db  0D0h,0,9Fh
    83.             db  0D0h,0,0A0h
    84.             db  0D0h,0,0A1h
    85.             db  0D0h,0,0A2h
    86.             db  0D0h,0,0A3h
    87.             db  0D0h,0,0A4h
    88.             db  0D0h,0,0A5h
    89.             db  0D0h,0,0A6h
    90.             db  0D0h,0,0A7h
    91.             db  0D0h,0,0A8h
    92.             db  0D0h,0,0A9h
    93.             db  0D0h,0,0AAh
    94.             db  0D0h,0,0ABh
    95.             db  0D0h,0,0ACh
    96.             db  0D0h,0,0ADh
    97.             db  0D0h,0,0AEh
    98.             db  0D0h,0,0AFh
    99.             db  0D0h,0,0B0h
    100.             db  0D0h,0,0B1h
    101.             db  0D0h,0,0B2h
    102.             db  0D0h,0,0B3h
    103.             db  0D0h,0,0B4h
    104.             db  0D0h,0,0B5h
    105.             db  0D0h,0,0B6h
    106.             db  0D0h,0,0B7h
    107.             db  0D0h,0,0B8h
    108.             db  0D0h,0,0B9h
    109.             db  0D0h,0,0BAh
    110.             db  0D0h,0,0BBh
    111.             db  0D0h,0,0BCh
    112.             db  0D0h,0,0BDh
    113.             db  0D0h,0,0BEh
    114.             db  0D0h,0,0BFh
    115.             db  0D1h,0,080h
    116.             db  0D1h,0,081h
    117.             db  0D1h,0,082h
    118.             db  0D1h,0,083h
    119.             db  0D1h,0,084h
    120.             db  0D1h,0,085h
    121.             db  0D1h,0,086h
    122.             db  0D1h,0,087h
    123.             db  0D1h,0,088h
    124.             db  0D1h,0,089h
    125.             db  0D1h,0,08Ah
    126.             db  0D1h,0,08Bh
    127.             db  0D1h,0,08Ch
    128.             db  0D1h,0,08Dh
    129.             db  0D1h,0,08Eh
    130.             db  0D1h,0,08Fh
    131. .code
    132.     mov esi,Buf1251 ;Источник
    133.     mov edi,BufUtf8 ;Приёмник
    134.     mov ecx,LenBuf1251  ;Длина источника
    135.     xor ebx,ebx ;А чтобы складывать потом
    136.     or  ecx,ecx ;Чтобы первый раз выставить Z (остальные разы - dec ecx)
    137.     .while !zero?   ;Пока не кончилась длина
    138.         xor eax,eax ;Для вычисления смещения
    139.         mov al,byte ptr [esi]   ;Прочитали байт приёмника
    140.         .if al<80h              ;0..7F - не надо преобразовывать
    141.             mov byte ptr [edi],al ;Перенесли байт в приёмник
    142.             inc edi ;Сместили указатель
    143.         .else
    144.             sub al,80h  ;Т.к. таблица не с начала
    145.             mov bl,al   ;Сохранили al
    146.             add eax,eax ;eax=eax*2
    147.             add eax,ebx ;eax=eax*2+eax=eax*3
    148.             mov edx,dword ptr [utf8tab+eax] ;Прочитали 4 байта из таблицы (используем только 3)
    149.             mov byte ptr [edi],dl   ;Записали в приёмник первый байт
    150.             inc edi ;Сместили указатель
    151.             .if dh  ;Если второй байт есть в utf8 эквиваленте
    152.                 mov byte ptr [edi],dh   ;То записываем его в приёмник
    153.                 inc edi ;Смещаем указатель
    154.             .endif
    155.             shr edx,8   ;dh <--- третий байт
    156.             mov byte ptr [edi],dh   ;И в приёмник его
    157.             inc edi ;Смещаем указатель
    158.         .endif
    159.         inc esi ;Смещаем указатель источника
    160.         dec ecx ;Длина--
    161.     .endw
    162.     mov eax,edi
    163.     sub eax,BufUtf8
    164.     ret
    165. Win1251ToUtf8   endp   
    166. ;-------------------------------------------------------------------------------