Zeff hat geschrieben:Worin liegt nun das Problem?
- Ich nehme an, dein Quelltext ist in UTF-8 kodiert (Standardeinstellung).
- Ich gehe auch davon aus, dass der Parameter -FcUTF-8 nicht an den Compiler übergeben wird (Standardeinstellung).
Daraus folgt jetzt:
- Der Compiler nimmt an, dass dein Quelltext in der Systemcodepage (vermutlich CP 1252, Windows) kodiert ist.
- Die Variable Hstr hat den Typ String; dem Typ String ist die CodePage CP_ACP (Systemcodepage) zugewiesen.
- Daher wird die Stringkonstante 'äöü' einfach in das Programm kopiert (Codepage des Variablentyps = Systemcodepage); es findet keine Konvertierung statt.
- Bei der Ausgabe findet ebenfalls keine Konvertierung statt, da die Systemcodepage bereits vorliegt.
Du hast verschiedene Möglichkeiten:
Code: Alles auswählen
program Project1;
Var Hstr : RawByteString;
Begin
Hstr := 'äöü';
SetCodePage(hstr, CP_UTF8, False);
Writeln(Hstr);
End.
Hier wird dem String der Typ RawByteString zugewiesen (keine Konvertierung durch den Compiler). Dem String wird die Codepage UTF-8 zugewiesen. Bei der Ausgabe wird der String in die Systemcodepage konvertiert.
Code: Alles auswählen
program Project1;
{$codepage utf-8}
Var Hstr : String;
Begin
Hstr := 'äöü';
Writeln(Hstr);
End.
Hier wird dem Compiler mitgeteilt, dass der Quelltext in UTF-8 vorliegt. Die Stringkonstante 'äöü' wird nicht konvertiert, da HStr die Codepage CP_ACP hat, die Stringkonstante die Codepage CP_UTF8 und der Quelltext ebenfalls CP_UTF8 hat. Bei der Ausgabe wird der Text in die Systemcodepage konvertiert.
Code: Alles auswählen
program Project1;
Var Hstr : RawByteString;
Begin
Hstr := 'äöü';
SetCodePage(hstr, CP_UTF8, False);
SetCodePage(Hstr, CP_ACP, True);
Writeln(Hstr);
End.
Hier geht der Compiler von der Quelltextcodepage 1252 aus; diese wird durch den ersten Aufruf von SetCodePage() korrigiert. Der zweite Aufruf konvertiert den String in die Systemcodepage. Bei der Ausgabe findet keine Konvertierung mehr statt.
Code: Alles auswählen
program Project1;
{$codepage utf-8}
Var Hstr : UTF8String;
astring: ansistring;
Begin
Hstr := 'äöü';
astring := hstr;
Writeln(astring);
End.
Hier ist Vorsicht geboten. Der Compiler kennt die Codepage des Quelltextes (UTF-8) und führt keine Konvertierung durch (Hstr ist ebenfalls UTF-8). Bei der Zuweisung an astring (CP_ACP = Systemcodepage) findet keine Konvertierung statt, da die Hstr die Codepage des Quelltextes hat. Die Konvertierung zur Systemcodepage findet erst bei der Ausgabe statt.
Die Dokumentation findest du übrigens hier:
http://wiki.freepascal.org/FPC_Unicode_ ... Ansistring
Vielleicht hilft es bei der Lektüre, wenn man "static code page" mit "Code page der Variablen (Datentyp)" und "dynamic code page" mit "Code page der konkreten Daten zur Laufzeit" übersetzt.
Edit: eine Variante ist mir noch eingefallen:
Code: Alles auswählen
program Project1;
{$codepage utf-8}
type
string1252 = type string(1252);
Var Hstr : UTF8String;
astring: string1252;
Begin
Hstr := 'äöü';
astring := hstr;
Writeln(astring);
End.
Hier wird ein Stringtyp mit bestimmter Codepage (1252) definiert. Da der Typ von Hstr die Codepage UTF-8 hat, wird bei der Zuweisung an astring (Codepage 1252) die Konvertierung durchgeführt.