Difference between revisions of "Utf16File To AnsiFile/de"

From Lazarus wiki
m
m
Line 2: Line 2:
 
<br>
 
<br>
 
<br>
 
<br>
Das Unterprogramm konvertiert eine UTF16-Datei in eine Ansi-Datei.<br>
+
Das Unterprogramm konvertiert eine UTF16-Datei in eine ANSI-Datei.<br>
Die Methode funktioniert nur beim westeuropäischen Zeichensatz. Andere Zeichensätze wie chinesisch, russisch, japanisch usw. benötigen eine sprachspezifische Umsetzungstabelle.<br>
+
Die Methode funktioniert nur beim westeuropäischen Zeichensatz. Andere Zeichensätze wie chinesisch, russisch, japanisch u.s.w. benötigen eine sprachspezifische Umsetzungstabelle.<br>
 
<br>
 
<br>
 
<syntaxhighlight>
 
<syntaxhighlight>
Line 13: Line 13:
 
function funDekodiereUtf16DateiZuAnsiDatei(
 
function funDekodiereUtf16DateiZuAnsiDatei(
 
   const conStrQuellDatei, conStrZielDatei: string): boolean;
 
   const conStrQuellDatei, conStrZielDatei: string): boolean;
   // Diese Unterprogramm übersetzt eine Unicode-Datei mit BOM zu einer Ansi-Datei.
+
   // Diese Unterprogramm übersetzt eine Unicode-Datei mit BOM zu einer ANSI-Datei.
 
   // Dieses Unterprogramm kann nur die Unicode-Dateien richtig umsetzen,
 
   // Dieses Unterprogramm kann nur die Unicode-Dateien richtig umsetzen,
 
   // die ausschliesslich Zeichen aus dem Westeuropäischen Zeichensatz 1252 enthalten
 
   // die ausschliesslich Zeichen aus dem Westeuropäischen Zeichensatz 1252 enthalten
Line 37: Line 37:
 
   Reset(txtQuelldatei);
 
   Reset(txtQuelldatei);
  
   // Prüft, ob die Datei gross genug ist um überhaupt eine BOM zu haben
+
   // Prüft, ob die Datei gross genug ist, um überhaupt eine BOM zu haben
 
   if FileSize(conStrQuellDatei) < 2 then
 
   if FileSize(conStrQuellDatei) < 2 then
 
     exit;
 
     exit;
Line 59: Line 59:
 
   end;
 
   end;
  
   // Übersetzt die Datei abhängig von der BOM von UTF16 (Unicode) nach Ansi
+
   // Übersetzt die Datei abhängig von der BOM von UTF16 (Unicode) nach ANSI
 
   while not EOF(txtQuelldatei) do
 
   while not EOF(txtQuelldatei) do
 
   begin
 
   begin

Revision as of 15:36, 21 September 2013

Deutsch (de)


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)