Utf16File To AnsiFile/de
From Free Pascal wiki
Jump to navigationJump to search
│
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
...
...