Klar. Hab ich auch noch nie gebraucht.BeniBela hat geschrieben:Wenn man denkt das sei einfacher als utf-8, verliert man alle Zeichen nach U+10000
Eine vernünftige Methode ist deshalb, dem Benutzer die Freiheit zu geben, die Codierung zu verwenden, die für seine Anwendung am sinnvollsten ist. (Z.B.: locale-Abhängiges 1-Byte/Zeichen ANSI, UTF8 (1++ Bytes/Zeichen), UTF16 (2++ Bytes/Zeichen), UTF32 (4 Bytes/Zeichen) oder vielleicht auch was ganz anderes u,u. selbst implementiertes).
Dafür wurden in Delphi die "codepage aware ANSIStrings" erfunden (wobei die Bezeichnung ziemlich idiotisch ist, weil meist Unicode verwendet wird und das ist für mich keine "ANSI-Codepage". Aber das ist natürlich Wortklauberei.)
Hier werden die Strings automatisch (theoretisch) immer genau dann umcodiert, wenn es nötig ist. Leider ist die Implementierung in Delpih XE meiner Ansicht nach sehr schlecht, da die API wichtiger mitgelieferter Komponenten (wie TStrings und Abkömmlinge wie TStringlist) dann doch wieder eine bestimmte Codierung erzwingen und durch unnötige Umkodierung hin und her Unmengen Performance klauen, sofern der User eine andere Codierung bevorzugt.
Eine andere Möglichkeiten wären z.B., beim in den Projekt-Optionen eine feste String Codierung zu hinterlegen und das Projekt jeweils entsprechend zu übersetzen, wobei in den Units andere Codierungen nur durch explizite User-Code-Programmierung möglich sind. (TStringList etc müsste dann natürlich auch jeweils entsprechend übersetzt werden.)
Aber das alles löst einige generelle Probleme nicht, die einem bei Unicode leicht das Genick brechen. Beispielsweise sind auch innerhalb desselben Unicode Codierungs-Schemas mehrere unterschiedliche Codierungs-Varianten für dasselbe "sichtbare" Zeichen zulässig. Hierdurch ist ein String-Vergleich auf Gleichheit nicht sauber zu machen. Da diese Varianten u.a. durch Doppel-Zeichen dargestellt werden ist (auch bei UTF32, wo jedes "Zeichen" genau einen "Code" hat) die String-Länge einer vorgegebenen (sichtbaren) Information nicht eindeutig definierbar.
Noch schlimmer wird es bei nicht-Case-Sensitivem Vergleich.
Noch schlimmer wird es bei Vergleich von Strings auf größer/kleiner (zum Sortieren). Dann kommt noch die Code-Reihenfolge zum Tragen, die auch bei Unicode locale - abhängig ist - obwohl der Sinn von Unicode ja eigentlich ist, locale-unabhängige Programmierung zu ermöglichen.
-Michael