Wiki-KopieMirror

Dies ist ein Mirror des Wikis von pascal.chat. Bearbeiten, Verlauf und Anmeldung finden dort statt.

Utf16File To AnsiFile/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.

pascal
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:

pascal

  ...

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

  ...

Aufruf unter Linux:

pascal

  ...

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

  ...

From the Free Pascal wiki, page "Utf16File To AnsiFile/de", as it stood on 2020-03-04 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.

Version 1, zuletzt geändert von WikiArchive .