Utf16File To AnsiFile/de

From Lazarus wiki
Jump to navigationJump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

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
    ...

  ...