Autor Beitrag
JSchirrmacher
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Do 29.07.10 09:17 
...und wir auch noch einen Kaiser hatten, war alles besser.

Gerade für mich, der viel im Keller zu tun hat, dort wo man mit Mikrocontrollern kommuniziert und simplen ASCII-Text parst, diesen in Massen durch named pipes, serielle Schnittstellen und so weiter schiebt. Dort traut sich mancher Informatiker nicht hin und doziert lieber "Hättest du mal gleich sauber programmiert.". Hätte ich diese Probleme früher vohergesehen, hätte ich 1. Konstrukte schaffen müssen, die jetzt zu den Delphi-Lösungen konkurrieren, oder wäre 2. als Korinthenkacker aufgetreten ("Aber Chef, das char könnte eines Tages auch mehr bytes haben - ich muss dafür erstmal ein Konzept machen")

Seit Delphi2009 klappts nun nicht mehr so einfach und ich habe mich nach einem Portierungskonzept umgeguckt (so wie Millionen andere auch).

Der simple Weg - dort wo sizeof(char) = sizeof(byte) zu sein versprach, AnsiString und PAnsiString zu verwenden schien als Lösung geeignet, zusammen mit einem Konzept, wo und wann man die AnsiString in Strings verwandelt, um sie sauber in die Oberfläche hochzupumpen.

Dieses Konzept zerplatzte, als ich folgende Zeilen aus der Borland-Doku las:

"An AnsiString represents a single-byte string. With a single-byte character set (SBCS), each byte in a string represents one character. In a multibyte character set (MBCS), the elements are still single bytes, but some characters are represented by one byte and others by more than one byte. Multibyte character sets--especially double-byte character sets (DBCS)--are widely used for Asian languages. An AnsiString can contain MBCS characters."

D.h., wenn der Chinese es will, dann enthält bei ihm plötzlich ein AnsiString auch ein multi-byte-char-set (MBCS), also ist dann sizeof(AnsiChar) plötzlich ungleich sizeof(byte). Oder wie?

Und RawByteString ist nur für Parameterübergaben gedacht. Ausserdem fehlen die vielen nützlichen Text-Funktionen, die es gerade noch für AnsiString geben mag.

Ja wie denn nun? Bin ich vielleicht zu pingelig und sollte mir einfach sagen: Wenn ein Chinese meine Programme nutzt, soll ihm der Kram doch um die Ohren fliegen! Ich hab doch gar nix gegen Chinesen. Oder ihre Schriftzeichen.

Nun überlege ich auf Low-Level nur noch TBytes zu verwenden und AnsiString einfach zu vergessen. Aber das ist unpraktisch, wenn tatsächlich immer nur SBCS übertragen wird.

Kennt sich jemand aus und/oder hat Erfahrung mit AnsiStrings, die MBCS enthalten?
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Fr 20.08.10 21:00 
Nein, SizeOf(Char) ist für jede Delphi-Version immer konstant und SizeOf(AnsiChar) immer 1. Egal ob MBCS oder nicht. MBCS ist die Codierung eines Strings.

Wenn du dir z.B. die Sources von AnsiStrPos anschaust, wirst du Sachen sehen wie if (ByteType <> mbTrailByte). Das ist nicht erst seit Delphi 2009 der Fall. Das war eigentlich schon immer (oder schon lange) so.

Die ganze MBCS Geschichte ist eigentlich relativ transparent für den Programmierer, es sei denn du musst die Strings auseinandernehmen (aufpassen, dass du nicht ein multi-byte Character auseinanderzerrst) oder was darin suchen.

Seit Delphi 2009 ist es im Gegenteil viel einfacher geworden. Es gibt nicht mehr zig verschiedene Codierungen, die je nach Ausführungsort verschieden sind.

Ganz früher war string = ShortString, bis Unicode war dann string = AnsiString. Wenn du in Delphi 2009 also AnsiString verwendest statt string, ist das Verhalten exakt gleich wie früher vor Unicode.