Kay hat geschrieben:
1. Was genau ist "String" für ein Datentyp - ein "AnsiString" oder ein "Utf8String" oder wird das automatisch an die Verwendung angepasst?
Delphi (2007-) ansistring wenn {$H+} oder {$mode delphi}, sonst shortstring.
Auf FPC ebene heißt das der System Encoding. Lazarus nimmt aber an das es _immer_ utf-8 ist. User müssen selber Konversionen einfügen wo nötig
2. Wenn "String" ein "Utf8String" sein sollte, was passiert dann, wenn ich eine Datei lese, deren Daten im ANSI-Zeichensatz kodiert sind? Wird der Datentyp dann automatisch auf "AnsiString" geändert, erfolgt eine automatische Umkodierung auf UTF-8 oder enthält meine Zeichenfolge dann "ungültige" Zeichen?
Gar nichts. utf8string ist (noch) 100% dasselbe als ansistring. Der andere Namen ist nur ein Hint um Konversionen ein zu fügen.
Das aendert sich in D2009+, aber FPC implementiert das noch nicht. (es gibt etwas experimentelles, aber das ist noch immer weit von seriösen Nutzen entfernt)
Dort konvertiert ansistring<>utf8string automatisch.
3. Gibt es eine Möglichkeit, vor der Verarbeitung einer Datei deren Zeichensatz zu bestimmen?
Nein, aber die meiste lese Routinen werden das binär einlesen, also wenn man weißt das den Encoding anders als der System Encoding ist, kann man konversionen auch NACH laden einfügen.
4. Wenn ich in der Lazarus-IDE unter Dateieinstellungen die Zeichenkoderung auf UTF-8 gestellt habe und ich weise einem Textfeld zur Entwurfszeit eine Zeichenfolge zu, ist die dann auch automatisch in UTF-8 kodiert?
Ich denke nicht, ich denke dass das Encoding von sogenannte Literals setzt (via den -Fc Parameter von FPC).
In den übrigen Beispiel ist 'Tütensuppe' ein Literal.
5. Was ist mit Text, den ich zur Laufzeit in ein Textfeld eingebe?
Das geht direkt nach Lazarus/LCL, also UTF8
6. Wie verhält es sich bei Dateinamen, die aus einem Open-Dialog ausgewählt werden:
OpenDialog1 ist ein LCL component, also UTF8.
Meines Wissens nach werden Dateinamen in Windows mit ANSI kodiert. Allerdings kann es natürlich auch sein, dass die TOpenDialog-Komponente eine automatische Umkodierung vornimmt. Bei der Funktion FileExists() dürfte ich dann allerdings Probleme bekommen oder?
Nein:
- Windows NT (NT4,2000,XP,Vista) hat zwei Satze Fukctionen fuer fast alles. -A funktionen nehmen ASCII in den System Encoding, und -W funktionen nehmen UTF16 unicode.
- Win9x hat normal nur -A Versionen
- Lazarus nutzt meistens -W Funktionen, aber intern konvertiert UTF8 nach UTF16
Es gibt nicht nur ansi und wide (resp. system ansi und utf8), aber auch noch OEMString. Das ist die Dos kompatibeler Encoding, und wird für Konsole (Dos) Windows genutzt.
Edit1.text ist Lazarus LCL, also UTF8, FileExists ist FPC, also System Encoding.
7. Wenn ich den Inhalt eines Textfeldes in eine Datei schreibe, bleibt dann der Unicode-Zeichensatz erhalten oder wird der Text automatisch auf den im System verwendeten Zeichensatz geändert?
Via LCL schreibe Weisen: hoffentlich UTF-8. Via FPC routinen: System Encoding.
8. Worin genau besteht jetzt eigentlich der Unterschied zwischen den Funktionen "AnsiToUtf8" und "Utf8Encode"?
Ich glaube den erste ist Windows/Delphi, den zweiten ist FPC und portabel.