Utf16File To AnsiFile/de
From Lazarus wiki
Jump to navigationJump to searchThe 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
...
...