А не подскажет ли многоуважаемый All, как перекодировать Win1251 в Utf8? Было бы вообще замечательно, если бы ткнули носом в ASM - пример...
Если winapi, то win1251 - utf16 - utf8. MultiByteToWideChar, WideCharToMultiByte. А так - см. описание utf8 и примеры здесь, на форуме.
Я вот тут на форуме нашёл такое объяснение: 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... )
Вот давным давно писал на php его (просто демонстрация алго, код даже для пхп не оптимизирован): Код (Text): function utf8toUTF8($string){ $out = ''; for ($i = 0; $i<strlen($string); ++$i){ $ch = ord($string{$i}); if ($ch < 0x80) $out .= chr($ch); else if($ch >= 0xC0) if($ch < 0xF0) $out .= "\xD0".chr(0x90 + $ch - 0xC0); else $out .= "\xD1".chr(0x80 + $ch - 0xF0); else switch($ch){ case 0xA8: $out .= "\xD0\x81"; break; case 0xB8: $out .= "\xD1\x91"; break; case 0xA1: $out .= "\xD0\x8E"; break; case 0xA2: $out .= "\xD1\x9E"; break; case 0xAA: $out .= "\xD0\x84"; break; case 0xAF: $out .= "\xD0\x87"; break; case 0xB2: $out .= "\xD0\x86"; break; case 0xB3: $out .= "\xD1\x96"; break; case 0xBA: $out .= "\xD1\x94"; break; case 0xBF: $out .= "\xD1\x97"; break; case 0x8C: $out .= "\xD3\x90"; break; case 0x8D: $out .= "\xD3\x96"; break; case 0x8E: $out .= "\xD2\xAA"; break; case 0x8F: $out .= "\xD3\xB2"; break; case 0x9C: $out .= "\xD3\x91"; break; case 0x9D: $out .= "\xD3\x97"; break; case 0x9E: $out .= "\xD2\xAB"; break; case 0x9F: $out .= "\xD3\xB3"; break; } } return $out; }
В общем, сделал как-то так. Если кому интересно - проверяйте правильность (может где наглючил с таблицей. На первый взгляд вроде верно). Но толком не тестировал. Код (Text): Win1251ToUtf8 proc uses ebx ecx edx esi edi Buf1251:dword,BufUtf8:dword,LenBuf1251:dword .data utf8tab db 0D0h,0,82h db 0D0h,0,83h db 0E2h,80h,9Ah db 0D1h,0,93h db 0E2h,80h,9Eh db 0E2h,80h,0A6h db 0E2h,80h,0A0h db 0E2h,80h,0A1h db 0E2h,82h,0ACh db 0E2h,80h,0B0h db 0D0h,0,89h db 0E2h,80h,0B9h db 0D0h,0,8Ah db 0D0h,0,8Ch db 0D0h,0,8Bh db 0D0h,0,8Fh db 0D1h,0,92h db 0E2h,80h,98h db 0E2h,80h,99h db 0E2h,80h,9Ch db 0E2h,80h,9Dh db 0E2h,80h,0A2h db 0E2h,80h,93h db 0E2h,80h,94h db 0C2h,0,98h db 0E2h,84h,0A2h db 0D1h,0,99h db 0E2h,80h,0BAh db 0D1h,0,9Ah db 0D1h,0,9Ch db 0D1h,0,9Bh db 0D1h,0,9Fh db 0C2h,0,0A0h db 0D0h,0,8Eh db 0D1h,0,9Eh db 0D0h,0,88h db 0C2h,0,0A4h db 0D2h,0,90h db 0C2h,0,0A6h db 0C2h,0,0A7h db 0D0h,0,81h db 0C2h,0,0A9h db 0D0h,0,84h db 0C2h,0,0ABh db 0C2h,0,0ACh db 0C2h,0,0ADh db 0C2h,0,0AEh db 0D0h,0,87h db 0C2h,0,0B0h db 0C2h,0,0B1h db 0D0h,0,86h db 0D1h,0,96h db 0D2h,0,91h db 0C2h,0,0B5h db 0C2h,0,0B6h db 0C2h,0,0B7h db 0D1h,0,91h db 0E2h,84h,96h db 0D1h,0,94h db 0C2h,0,0BBh db 0D1h,0,98h db 0D0h,0,85h db 0D1h,0,95h db 0D1h,0,97h db 0D0h,0,90h db 0D0h,0,91h db 0D0h,0,92h db 0D0h,0,93h db 0D0h,0,94h db 0D0h,0,95h db 0D0h,0,96h db 0D0h,0,97h db 0D0h,0,98h db 0D0h,0,99h db 0D0h,0,9Ah db 0D0h,0,9Bh db 0D0h,0,9Ch db 0D0h,0,9Dh db 0D0h,0,9Eh db 0D0h,0,9Fh db 0D0h,0,0A0h db 0D0h,0,0A1h db 0D0h,0,0A2h db 0D0h,0,0A3h db 0D0h,0,0A4h db 0D0h,0,0A5h db 0D0h,0,0A6h db 0D0h,0,0A7h db 0D0h,0,0A8h db 0D0h,0,0A9h db 0D0h,0,0AAh db 0D0h,0,0ABh db 0D0h,0,0ACh db 0D0h,0,0ADh db 0D0h,0,0AEh db 0D0h,0,0AFh db 0D0h,0,0B0h db 0D0h,0,0B1h db 0D0h,0,0B2h db 0D0h,0,0B3h db 0D0h,0,0B4h db 0D0h,0,0B5h db 0D0h,0,0B6h db 0D0h,0,0B7h db 0D0h,0,0B8h db 0D0h,0,0B9h db 0D0h,0,0BAh db 0D0h,0,0BBh db 0D0h,0,0BCh db 0D0h,0,0BDh db 0D0h,0,0BEh db 0D0h,0,0BFh db 0D1h,0,080h db 0D1h,0,081h db 0D1h,0,082h db 0D1h,0,083h db 0D1h,0,084h db 0D1h,0,085h db 0D1h,0,086h db 0D1h,0,087h db 0D1h,0,088h db 0D1h,0,089h db 0D1h,0,08Ah db 0D1h,0,08Bh db 0D1h,0,08Ch db 0D1h,0,08Dh db 0D1h,0,08Eh db 0D1h,0,08Fh .code mov esi,Buf1251 ;Источник mov edi,BufUtf8 ;Приёмник mov ecx,LenBuf1251 ;Длина источника xor ebx,ebx ;А чтобы складывать потом or ecx,ecx ;Чтобы первый раз выставить Z (остальные разы - dec ecx) .while !zero? ;Пока не кончилась длина xor eax,eax ;Для вычисления смещения mov al,byte ptr [esi] ;Прочитали байт приёмника .if al<80h ;0..7F - не надо преобразовывать mov byte ptr [edi],al ;Перенесли байт в приёмник inc edi ;Сместили указатель .else sub al,80h ;Т.к. таблица не с начала mov bl,al ;Сохранили al add eax,eax ;eax=eax*2 add eax,ebx ;eax=eax*2+eax=eax*3 mov edx,dword ptr [utf8tab+eax] ;Прочитали 4 байта из таблицы (используем только 3) mov byte ptr [edi],dl ;Записали в приёмник первый байт inc edi ;Сместили указатель .if dh ;Если второй байт есть в utf8 эквиваленте mov byte ptr [edi],dh ;То записываем его в приёмник inc edi ;Смещаем указатель .endif shr edx,8 ;dh <--- третий байт mov byte ptr [edi],dh ;И в приёмник его inc edi ;Смещаем указатель .endif inc esi ;Смещаем указатель источника dec ecx ;Длина-- .endw mov eax,edi sub eax,BufUtf8 ret Win1251ToUtf8 endp ;-------------------------------------------------------------------------------