// Ansi in UTF8 und UTF8 in Ansi konvertieren:


// Getestet mit D4 unter XP
// (Neuere Versionen siehe weiter unten)

var 
  WStr: WideString; 
  sz: integer; 

 
procedure Ansi2Unicode(s: string; var WStr: WideString; CP: UINT); 
begin 
  sz := MultiByteToWideChar(CP, 0, PChar(s), -1, nil, 0); 
  setlength(WStr, sz * 2); 
  MultiByteToWideChar(CP, 0, PChar(s), -1, PWidechar(WStr), sz); 
end; 
 
procedure Unicode2Ansi(WStr: WideString; var s: string; CP: UINT); 
begin 
  sz := WideCharToMultiByte(CP, 0, PWidechar(WStr), -1, 
    nil, 0, nil, nil); 
  setlength(s, sz); 
  WideCharToMultiByte(CP, 0, PWidechar(WStr), -1, PChar(s), 
    sz, nil, nil); 
end; 
 
 
function Ansi2UTF8(s: string): string; 
begin 
  Ansi2Unicode(s, WStr, CP_ACP); 
  Unicode2Ansi(WStr, Result, CP_UTF8); 
end; 
 
function UTF82Ansi(s: string): string; 
begin 
  Ansi2Unicode(s, WStr, CP_UTF8); 
  Unicode2Ansi(WStr, Result, CP_ACP); 
end; 
 

// Beispielaufruf 
 
procedure TForm1.Button3Click(Sender: TObject); 
begin 
  label5.font.name := 'Arial'; 
  Label5.caption := Ansi2UTF8('Ärger für Ämter über die Ödipus-Straße'); 
  Label6.caption := UTF82Ansi(Label5.caption); 
end;
 
// Wenn man UTF8-Text in eine Datei schreiben will, muss diese gekennzeichnet
// sein, damit andere Programme (z.B. Notepad) diese ordnungsgemäß auslesen können. 

// Erzeugen einer UTF8-Datei 
 
procedure SaveUTF8(str: string; fn: TFileName); 
var 
  sl: TStringList; 
begin 
  sl := TStringList.Create; 
  sl.text := '' + Ansi2Utf8(str); 
  sl.SaveToFile(fn); 
  sl.free; 
end; 
 
// Beispielaufruf 
 
procedure TForm1.Button1Click(Sender: TObject); 
begin 
  memo1.clear; 
  memo1.lines.add('UTF8-Test'); 
  memo1.lines.add('ÄÖÜäöüß'); 
  SaveUTF8(memo1.text, 'C:\Test_UTF8.txt'); 
end; 
 
// danach zum Anschauen als einfachen Text laden 
 
procedure TForm1.Button2Click(Sender: TObject); 
begin 
  memo1.lines.loadfromfile('C:\Test_UTF8.txt'); 
end; 
 
// auf UTF8 testen und entsprechend laden 
 
procedure TForm1.Button3Click(Sender: TObject); 
var 
  sl: TStringlist; 
begin 
  sl := TStringlist.Create; 
  sl.loadfromfile('C:\Test_UTF8.txt'); 
  if sl.count > 0 then begin 
    if copy(sl[0], 1, 3) = '' then 
      memo1.text := UTF82Ansi(copy(sl.text, 4, maxint)) 
    else memo1.lines.assign(sl); 
  end else memo1.clear; 
  sl.free; 
end;
//------------------------------------
// Variante
var 
  SList: TStringList; 
 
procedure TForm1.FormCreate(Sender: TObject); 
begin 
  SList := TStringList.Create; 
end; 
 
procedure TForm1.FormDestroy(Sender: TObject); 
begin 
  FreeAndNil(SList); 
end; 
 
procedure TForm1.Button1Click(Sender: TObject); 
begin 
  SList.LoadFromFile('D:\Test.txt', TEncoding.UTF8); 
  SList.SaveToFile('D:\Kopie.txt', TEncoding.ANSI); 
end; 
 
procedure TForm1.Button2Click(Sender: TObject); 
begin 
  SList.LoadFromFile('D:\Kopie.txt', TEncoding.ANSI); 
  SList.SaveToFile('D:\Test.txt', TEncoding.UTF8); 
end;



 

Zugriffe seit 6.9.2001 auf Delphi-Ecke