pluto hat geschrieben:Werde weitere Test zu gegebener Zeit durchführen. Ich verstehe gar nicht warum das so kompliziert ist. Es müsste doch voll kommen reichen wenn ich in meinem code statt string widetstring nutzte. wenn ich jetzt auf ein Char zurückgreifen möchte müsste es doch ein UTF8Char sein. Aber genau das ist anscheint nicht der Fall. Ich sehe das als BUG in Lazarus. Dazu wird es auch noch viele fragen geben. Ganz verstanden habe ich es auch noch nicht. Ich nutzte in dem Projekt nur Widestring. Einheitlich. Da einige Test ergeben haben das ich damit auch mit Umlaute Arbeiten kann.
Das Problem ist, dass ein Widestring die Codierung UCS2 (wenn ich mich nicht irre) verwendet. Damit können so ziemlich alle lebende Sprachen kodiert in 2Byte werden. Zwar gibt es die irgendwo mal angesprochene Surrogate-Technik um mehr Zeichen (d.h. alle Unicode Zeichen) zu kodieren, aber ich bezweifle, dass dies von dem FPC/der LCL irgendwo genutzt wird.
Der Quelltext wird standardmäßig in UTF-8 kodiert. Somit sind auch alle Strings UTF8Strings (es gibt je technisch gesehen keinen Unterschied zwischen AnsiString und UTF8String). Wenn du also einen Quelltextzeichen/-string in einen WideChar/-string packen willst, musst du function UTF8Decode(const s : UTF8String): WideString; verwenden. Der Buchstabe 'ä' belegt immer 2Byte - sowohl in UTF-8 (als Multibyte-Zeichen) als auch in UCS-2 (ein WideChar).
Vergleiche müssen also immer mit dieser Funktion oder korrekt kodierten Variablen durchgeführt werden. Die Ausgabe eines Widestrings setzt aber auch eine LCL mit WideString-Unterstützung voraus. D.h. unter Win32 (bei mir noch ohne) wird ein WideString nicht wirklich richtig angezeigt. Zwar kann man einen UTF8String ohne Compilermeldung in einen WideString speichern, aber dann ist dieser einfach falsch kodiert und enthält nach der UCS-2-Kodierung falsche Zeichen.
MfG Socke
P.S. Eine Programmierumgebung mit unterschiedlichem Unicode-Support (FCL und LCL sind da unterschiedliche) verhindern das eindeutige Behandeln von Strings; Einsteiger sollte/muss man darauf Hinweisen, dass das, was man in der IDE eingibt, ein UTF8 kodierter String ist und in einer AnsiString-Variablen gespeichert wird; und dass man dann trotzdem nicht immer mit s
ein vollständiges Zeichen erhält. Ein Typ für UTF-8 Buchstaben wäre zwingend ein ganzer String (und das muss man wissen).
P.P.S. Warum benutzt mein Lazarus (0.9.26) unter WinXP immer noch CP1252 als Kodierung (mir ist klar, dass ich das umstellen kann/muss, und ich tue dies auch)?