theo hat geschrieben:Dann definiere doch mal. Ich hab nichts dagegen. Alles ist besser als rummeckern.

Ich verstehe wirklich nicht, was Du als "meckern" empfindet. Ich habe doch genau das gemacht: eine vorläufige Definition von dem gegeben, was ich als sinnvolle Erweiterung zum Umgang mit Unicode (und auch anders codierte) Strings vrschlagen würde:
Zusammengefasst Im Klartext:
Es gibt einen Basis-Typ der einen String beliebiger Codierung enthalten kann (nennen wir ihn provisorisch BaseString). Er hat eine dynamische Kennung für Codierung und Byte_pro_Codewort. (Wie bei Delphi.)
Es gibt einen Type, der (im allgemeinen) genau ein "druckbares Zeichen" enthalten sollte (BaseChar, vermutlich ist das auch einfach nur ein BaseString, kann also statisch ( "Basechar[CodeNummer]" ) oder voll dynamisch (z.B. "BaseChar[$FFFE]" ) codiert sein).
Es gibt einen Type, der Code-Elemente (8, 16 oder 32 Bit) aufnehmen kann.
Man kann beim Programmieren String-Typen mit vorgegebener Codierung verwenden (Delphi-Notation String[CodeNummer]). Dadurch kann zur Compile-Zeit bereits über notwendige Umcodierungen entschieden werden was Rechenzeit spart (wie bei Delphi).
Dabei gibt es außer den festgelegten Codenummern (Länderspezifisches ANSI, verschiedene Unicode Varianten, (und neu:) die Codierung, die bei HTML-Texten verwendet wird) die Codenummer "0" (Durch das System festgelegter Default) und "$FFFF" (kein Code, wird nie konvertiert). Bei derart festgelegten statischen Typen ist die dynamisch in der String Variale gespeicherte Codierung (i.A.) gleich der statischen des Typs (bei "0": ???). (Alles wie bei Delphi.)
Zusätzlich gibt es noch eine Type-Nummer (z.B. "$FFFE") für "dynamische Codierung". Bei diesem Type (statische Festlegung im Quellcode) entschiedet die dynamische Codierung im String selbst über die Konvertierung:
- Bei Zuordnung auf so einen Type durch ":=" wird die Codierung übernommen.
- Bei Zuordnung von diesem Type auf einen statisch definierten Typ wird entsprechend umcodiert.
- bei Vergleichen wird (virtuell) entsprechend umcodiert. Technisch ist es natürlich sinnvoll, in der RTL einen Vergleich unterschiedlich codierter Strings auszuprogrammieren und nicht die kompletten Strings vorher zu konvertieren und dann zu vergleichen. (Delphi beachtet - soweit ich weiß, keine Unicode (de-)composed character, richtigerweise sollte das aber bei Umcodieren und Vergleich immer gemacht werden.)
- Bei Übergabe an ein Unterprogramm (der Formal-Parameter hat diesen Tpy) wird die Codierung übernommen.
- Var und out - Parameter: Vermutlich ist klar, was zu machen ist, da könnte es aber einige Haken und Ösen geben.
Standard - Funktionen wie Copy(), Pos, Length(), ... arbeiten virtuell mit diesem Typ, Compiler-Magic sogt dafür, dass statische definierte Typen entsprechend beachtet werden. (Wie in Delphi, außer es wird der voll dynamisch codierte Type als AktualParameter verwendet.
Mit dem dynamichen Typ ist es möglich, Funktionen zu schreiben, die allgemein verwendbar sind und keine Umcodierungen allein durch die Parameter-Übergabe erzwingen. (Ich weiß bis heute nicht, ob das bei Delphi geht.)
String
ergibt ein Code-Element im entsprechenden Typ (also kein komplettes Unicode-Zeichen, weder normal noch (de-)composed) (wie in Delphi, muss entsprechend dokumentiert werden, weil Legacy-Code dadurch unbrauchbar wird).
Copy, Length, Pos, ... arbeiten in Code-Elementen (wie in Delphi, muss entsprechend dokumentiert werden, weil Legacy-Code dadurch unbrauchbar werden kann)
Es gibt einen Iterator, nennen wir ihn "BaseString.NextPrintableChar", der das nächste komplette Zeichen abgibt (neu) (viele Haken und Ösen bei (de)composed Caractern, wenn die Tabelle aus dem Betriebssystem verwendet wird, liegt die Verantwortung da.)
Es gibt eine Compiler-Magic für "case" und Vergleich (mit "="), wenn als Entscheidungs-Type ein BaseChar verwendet wird. Hier wird (virtuell oder dynamisch) entsprechend umcodiert (inclusive Behandling der (de-)composed Character). Konstanten werden natürlich schon zur Compile-Zeit so angelegt, dass sie - wenn der Vergleichs-Typ statisch kodiert ist - nicht umcodiert werden müssen. (ansonsten haben sie die System-Default-Codierung "0").
Durch die (de-)composed character wird das Umcodieren aufwendiger als bei Delphi. Da aber meist statisch codierte Strings verwendet werden ist Umcodieren nur selten nötig.
Probleme machen die (de-)composed Character bei allen Vergleichen. Da muss die Laufzeit-Erhöhung hingenommen werden, um den Comfort zu habe, diese überhaupt sinnvoll verarbeiten zu können. Vielleicht sollte man das irgendwie abschaltbar machen.
(Ist natürlich alles nur ein erster Vorschlag, der im Detail ausgefeilt und auf realisierbarkeut untersucht werden müsste, was natürlich nie passieren wird.)
-Michael