Sign in Join
Wiki copytemporary

Utf16File To AnsiFile/de: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: Utf16File To AnsiFile/de

OldNewLine
1+Zurück zur Seite [[code examples/de|Code Beispiele]].
2+
3+Das Unterprogramm konvertiert eine UTF16-Datei in eine ANSI-Datei.
4+
5+Die Methode funktioniert nur beim westeuropäischen Zeichensatz. Andere Zeichensätze wie chinesisch, russisch, japanisch u.s.w. benötigen eine sprachspezifische Umsetzungstabelle.
6+
7+``` pascal
8+uses
9+ FileUtil, ...;
10+
11+ ...
12+
13+function funDekodiereUtf16DateiZuAnsiDatei(
14+ const conStrQuellDatei, conStrZielDatei: string): boolean;
15+ // Diese Unterprogramm übersetzt eine Unicode-Datei mit BOM zu einer ANSI-Datei.
16+ // Dieses Unterprogramm kann nur die Unicode-Dateien richtig umsetzen,
17+ // die ausschliesslich Zeichen aus dem Westeuropäischen Zeichensatz 1252 enthalten
18+ // in allen anderen Fällen, kommt nur Datenmüll heraus.
19+var
20+ txtQuelldatei: file of char;
21+ txtZieldatei: file of char;
22+ chrZeichen: char;
23+
24+ strBOM: string = '';
25+
26+ blnBigEndian: boolean = False;
27+ blnZweitesZeichen: boolean = False;
28+
29+begin
30+
31+ Result := False;
32+
33+ assignfile(txtQuelldatei, UTF8ToSys(conStrQuellDatei));
34+ assignfile(txtZieldatei, UTF8ToSys(conStrZielDatei));
35+ Rewrite(txtZieldatei);
36+
37+ Reset(txtQuelldatei);
38+
39+ // Prüft, ob die Datei gross genug ist, um überhaupt eine BOM zu haben
40+ if FileSize(conStrQuellDatei) < 2 then
41+ exit;
42+
43+ // Liest die ersten beiden Zeichen ein (nur diese beinhalten eine BOM)
44+ Read(txtQuelldatei, chrZeichen);
45+ strBOM := strBOM + chrZeichen;
46+ Read(txtQuelldatei, chrZeichen);
47+ strBOM := strBOM + chrZeichen;
48+
49+ // Prüft auf eine UTF16 BOM und bricht ab, wenn keine UTF16 BOM vorhanden ist
50+ case strBOM of
51+ // Big Endian
52+ #$FE#$FF:
53+ blnBigEndian := True;
54+ // Little Endian
55+ #$FF#$FE:
56+ blnBigEndian := False
57+ else
58+ Exit
59+ end;
60+
61+ // Übersetzt die Datei abhängig von der BOM von UTF16 (Unicode) nach ANSI
62+ while not EOF(txtQuelldatei) do
63+ begin
64+
65+ Read(txtQuelldatei, chrZeichen);
66+ if blnBigEndian = True then
67+ begin
68+ if blnZweitesZeichen = True then
69+ begin
70+ Write(txtZieldatei, chrZeichen);
71+ blnZweitesZeichen := False;
72+ end
73+ else
74+ blnZweitesZeichen := True;
75+ end;
76+
77+ if blnBigEndian = False then
78+ begin
79+ if blnZweitesZeichen = False then
80+ begin
81+ Write(txtZieldatei, chrZeichen);
82+ blnZweitesZeichen := True;
83+ end
84+ else
85+ blnZweitesZeichen := False;
86+ end;
87+
88+ end;
89+
90+ CloseFile(txtQuelldatei);
91+ CloseFile(txtZieldatei);
92+
93+ Result := True;
94+
95+end;
96+```
97+
98+Aufruf unter Windows:
99+
100+``` pascal
101+
102+ ...
103+
104+ if funDekodiereUtf16DateiZuAnsiDatei('D:\Test_BE.txt', 'D:\Test_Ansi.txt') then
105+ ...
106+
107+ ...
108+```
109+
110+Aufruf unter Linux:
111+
112+``` pascal
113+
114+ ...
115+
116+ if funDekodiereUtf16DateiZuAnsiDatei('/home/user/Test_BE.txt', '/home/user/Test_Ansi.txt') then
117+ ...
118+
119+ ...
120+```
121+
122+---
123+*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](/wiki-contact).*

Back to history