Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.06.29;
Скачать: CL | DM;

Вниз

UTF-8 to Windows-1251 (ANSI) --> библиотека DIConverters.pas   Найти похожие ветки 

 
Zhachuk ©   (2005-06-08 11:14) [0]

Имеется проблема: необходимо перекодировать строку в кодировке 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) [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;



Страницы: 1 вся ветка

Текущий архив: 2005.06.29;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.026 c
4-1115289584
pavel_guzhanov
2005-05-05 14:39
2005.06.29
Как определить размер файла?


5-1086858722
snake2003
2004-06-10 13:12
2005.06.29
создание своего combobox


14-1117642269
Delphinium
2005-06-01 20:11
2005.06.29
Visual C++


14-1117653262
Avals-Z
2005-06-01 23:14
2005.06.29
Загрузка WinXP


1-1118174449
Pasha L
2005-06-08 00:00
2005.06.29
Директория из TSearchRec