Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

UTF-8 to Windows-1251 (ANSI) --> библиотека DIConverters.pas [D1, D2, D3, D4, D5, Win95/98, WinME, NT4, Win2k, WinXP]


Zhachuk ©   (2005-06-08 11:14:00) 

Имеется проблема: необходимо перекодировать строку в кодировке UTF-8 в Windows-1251 средствами Delphi-4. В Delphi-6 есть функция Utf8ToAnsi, которая и делает все дело, однако в Delphi-4 ее нет. В результате долгих поисков в Интернете нарыл бесплатную библиотеку DIConverters.pas ( http://www.zeitungsjunge.de/delphi/converters/index.htm), которая вроде как позволяет конвертировать из UTF-8 в Unicode. Однако умения воспользоваться этой библиотекой не хватает :)
Если у кого есть мысли, как выполнить перекодировку UTF-8 --> Unicode --> Windows-1251, please, чиркните примерчик.


dmitry501   (2005-06-08 11:32:00) [1]

Zhachuk ©   (08.06.05 11:14)
Вот, взял из  Audio Tools Library (Freeware) http://jfaul.de/atl

UTF-ANSI
function ConvertFromUTF8(const Source: string): string;
var
 Iterator, SourceLength, FChar, NChar: Integer;
begin
 { Convert UTF-8 string to ANSI string }
 Result := '';
 Iterator := 0;
 SourceLength := Length(Source);
 while Iterator < SourceLength do
 begin
   Inc(Iterator);
   FChar := Ord(Source[Iterator]);
   if FChar >= $80 then
   begin
     Inc(Iterator);
     if Iterator > SourceLength then break;
     FChar := FChar and $3F;
     if (FChar and $20) <> 0 then
     begin
       FChar := FChar and $1F;
       NChar := Ord(Source[Iterator]);
       if (NChar and $C0) <> $80 then  break;
       FChar := (FChar shl 6) or (NChar and $3F);
       Inc(Iterator);
       if Iterator > SourceLength then break;
     end;
     NChar := Ord(Source[Iterator]);
     if (NChar and $C0) <> $80 then break;
     Result := Result + WideChar((FChar shl 6) or (NChar and $3F));
   end
   else
     Result := Result + WideChar(FChar);
 end;
end;


UTF-UNICODE

function DecodeUTF8(const Source: string): WideString;
var
 Index, SourceLength, FChar, NChar: Cardinal;
begin
 { Convert UTF-8 to unicode }
 Result := '';
 Index := 0;
 SourceLength := Length(Source);
 while Index < SourceLength do
 begin
   Inc(Index);
   FChar := Ord(Source[Index]);
   if FChar >= $80 then
   begin
     Inc(Index);
     if Index > SourceLength then exit;
     FChar := FChar and $3F;
     if (FChar and $20) <> 0 then
     begin
       FChar := FChar and $1F;
       NChar := Ord(Source[Index]);
       if (NChar and $C0) <> $80 then  exit;
       FChar := (FChar shl 6) or (NChar and $3F);
       Inc(Index);
       if Index > SourceLength then exit;
     end;
     NChar := Ord(Source[Index]);
     if (NChar and $C0) <> $80 then exit;
     Result := Result + WideChar((FChar shl 6) or (NChar and $3F));
   end
   else
     Result := Result + WideChar(FChar);
 end;
end;


function EncodeUTF8(const Source: WideString): string;
var
 Index, SourceLength, CChar: Cardinal;
begin
 { Convert unicode to UTF-8 }
 Result := '';
 Index := 0;
 SourceLength := Length(Source);
 while Index < SourceLength do
 begin
   Inc(Index);
   CChar := Cardinal(Source[Index]);
   if CChar <= $7F then
     Result := Result + Source[Index]
   else if CChar > $7FF then
   begin
     Result := Result + Char($E0 or (CChar shr 12));
     Result := Result + Char($80 or ((CChar shr 6) and $3F));
     Result := Result + Char($80 or (CChar and $3F));
   end
   else
   begin
     Result := Result + Char($C0 or (CChar shr 6));
     Result := Result + Char($80 or (CChar and $3F));
   end;
 end;
end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо