Форум: "Основная";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];
Вниз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-ANSIfunction 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-UNICODEfunction 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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.042 c