Utf16File To AnsiFile/de

From Lazarus wiki

Deutsch (de)
Zurück zur Seite Code Beispiele.

Das Unterprogramm konvertiert eine UTF16-Datei in eine ANSI-Datei.
Die Methode funktioniert nur beim westeuropäischen Zeichensatz. Andere Zeichensätze wie chinesisch, russisch, japanisch u.s.w. benötigen eine sprachspezifische Umsetzungstabelle.

uses
  FileUtil, ...;

  ...

function funDekodiereUtf16DateiZuAnsiDatei(
  const conStrQuellDatei, conStrZielDatei: string): boolean;
  // Diese Unterprogramm übersetzt eine Unicode-Datei mit BOM zu einer ANSI-Datei.
  // Dieses Unterprogramm kann nur die Unicode-Dateien richtig umsetzen,
  // die ausschliesslich Zeichen aus dem Westeuropäischen Zeichensatz 1252 enthalten
  // in allen anderen Fällen, kommt nur Datenmüll heraus.
var
  txtQuelldatei: file of char;
  txtZieldatei: file of char;
  chrZeichen: char;

  strBOM: string = '';

  blnBigEndian: boolean = False;
  blnZweitesZeichen: boolean = False;

begin

  Result := False;

  assignfile(txtQuelldatei, UTF8ToSys(conStrQuellDatei));
  assignfile(txtZieldatei, UTF8ToSys(conStrZielDatei));
  Rewrite(txtZieldatei);

  Reset(txtQuelldatei);

  // Prüft, ob die Datei gross genug ist, um überhaupt eine BOM zu haben
  if FileSize(conStrQuellDatei) < 2 then
    exit;

  // Liest die ersten beiden Zeichen ein (nur diese beinhalten eine BOM)
  Read(txtQuelldatei, chrZeichen);
  strBOM := strBOM + chrZeichen;
  Read(txtQuelldatei, chrZeichen);
  strBOM := strBOM + chrZeichen;

  // Prüft auf eine UTF16 BOM und bricht ab, wenn keine UTF16 BOM vorhanden ist
  case strBOM of
    // Big Endian
    #$FE#$FF:
      blnBigEndian := True;
    // Little Endian
    #$FF#$FE:
      blnBigEndian := False
    else
      Exit
  end;

  // Übersetzt die Datei abhängig von der BOM von UTF16 (Unicode) nach ANSI
  while not EOF(txtQuelldatei) do
  begin

    Read(txtQuelldatei, chrZeichen);
    if blnBigEndian = True then
    begin
      if blnZweitesZeichen = True then
      begin
        Write(txtZieldatei, chrZeichen);
        blnZweitesZeichen := False;
      end
      else
        blnZweitesZeichen := True;
    end;


    if blnBigEndian = False then
    begin
      if blnZweitesZeichen = False then
      begin
        Write(txtZieldatei, chrZeichen);
        blnZweitesZeichen := True;
      end
      else
        blnZweitesZeichen := False;
    end;

  end;

  CloseFile(txtQuelldatei);
  CloseFile(txtZieldatei);

  Result := True;

end;


Aufruf unter Windows:

  ...

  if funDekodiereUtf16DateiZuAnsiDatei('D:\Test_BE.txt', 'D:\Test_Ansi.txt') then
    ...

  ...


Aufruf unter Linux:

  ...

  if funDekodiereUtf16DateiZuAnsiDatei('/home/user/Test_BE.txt', '/home/user/Test_Ansi.txt') then
    ...

  ...



--Olaf 10:04, 14 September 2013 (CEST)