Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Unicode/WChar im BCB darstellen (https://www.delphipraxis.net/82890-unicode-wchar-im-bcb-darstellen.html)

messie 21. Dez 2006 13:52


Unicode/WChar im BCB darstellen
 
Moin,
wir hatten das Thema schonmal in Delphi, jetzt wollte ich mal die BCB-IDE nach dem gleichen Prinzip beschicken
So sah das in Delphi 6 aus:
Delphi-Quellcode:
Form1.Caption := WideString(#$043F)+#$043E+#$0442+#$0435+#$0440+#$0438+#$0020+
    #$0442+#$0435+#$043F+#$043B+#$0430;
Die Anzeige zeigt dann "потери тепла".
So geht es nicht in BCB 6:
Code:
Form1->Caption = (WideString)(0x0430);
Im Builder bekomme ich als Caption dann den gewandelten Dezimalwert von 0430h, also der Typecast wird zum Wandeln verwendet.
Sehr merkwürdig...was geht da denn wieder schief?

Grüße, Messie

Olli 31. Dez 2006 01:15

Re: Unicode/WChar im BCB darstellen
 
Versuche doch mal ... \x<HexCode>

Nachtrag: im String kannst du ANSI-Zeichen einfach so eintippen und dann die anderen Spezial-Unicode-Zeichen wie oben. Der String sollte so aussehen, denke ich:

L"Blablubb\x43F" usw.

Bin aber nicht sicher, ob man noch eine 0 zwichen das x und die Zahl quetschen muß/sollte (und habe keinen Bock es hier und jetzt zu testen ... zuviel Cognac intus :mrgreen: )

Robert Marquardt 31. Dez 2006 05:21

Re: Unicode/WChar im BCB darstellen
 
Nichts geht da schief. # in Delphi macht den Zahlenwert zum Char und von Char zu string und von string zu WideString wird die Konversion unterstuetzt. Bei C ist der Typecast aber hart. Ich kenne mich jetzt nicht mit den C++ Typwandlungen aus, aber da sollte eine dabei sein.

Olli 31. Dez 2006 05:48

Re: Unicode/WChar im BCB darstellen
 
Code:
L"\x043F\x043E\x0442\x0435\x0440\x0438 \x0442\x0435\x043F\x043B\x0430"
ist aber viel cplusplusiger :mrgreen: ... und man kann es bspw. mit normalen ANSI-Zeichen mischen, wodurch man beweisen kann polyglott zu sein und das mal eben in verschiedenen Sprachen zeigt:
Code:
L"DE=Hallo/EN=Hello/RU=\x041f\x0440\x0438\x0432\x0435\x0442/PL=Cze\x015b\x0107/SV=Hej"
(noch wach, aber wieder nüchtern :mrgreen: :mrgreen: :mrgreen: )

BTW: Hart ist der nur, weil es keinen expliziten Operator gibt, man also quasi einen C-Cast bekommt.

messie 31. Dez 2006 11:39

Re: Unicode/WChar im BCB darstellen
 
Zitat:

Zitat von Olli
Code:
L"\x043F\x043E\x0442\x0435\x0440\x0438 \x0442\x0435\x043F\x043B\x0430"
ist aber viel cplusplusiger :mrgreen: ... und man kann es bspw. mit normalen ANSI-Zeichen mischen, wodurch man beweisen kann polyglott zu sein und das mal eben in verschiedenen Sprachen zeigt:
Code:
L"DE=Hallo/EN=Hello/RU=\x041f\x0440\x0438\x0432\x0435\x0442/PL=Cze\x015b\x0107/SV=Hej"

Ja, das funzt erstmal gut, danke. Auch der Zeilenumbruch ist ja so gelöst. Leider komme ich nicht weiter, wenn ich einen Widestring erweitern bzw zusammensetzen will:
Code:
WideString s1 = L"\x043F\x043E\x0442\x0435\x0440\x0438\x0442\x0435\x043F\x043B\x0430"
         L"\x043F\x043E\x0442\x0435\x0440\x0438 \x0442\x0435\x043F\x043B\x0430";
geht, aber bei
Code:
s1 = s1 + WideString("a");
klemmt es dann (Out of memory).
Wie bekomme ich denn meine Indexbuchstaben etc. da angehängt? Und was macht das 'L' vor dem String genau?

Grüße, Messie

Robert Marquardt 31. Dez 2006 12:41

Re: Unicode/WChar im BCB darstellen
 
L vor dem String ist C Syntax fuer ein Unicode String Literal. Die String-Konstante wird von Compiler nicht als C-String-Typ sondern als Unicode-String-Typ gehandelt.

messie 31. Dez 2006 13:54

Re: Unicode/WChar im BCB darstellen
 
Zitat:

Zitat von Robert Marquardt
L vor dem String ist C Syntax fuer ein Unicode String Literal. Die String-Konstante wird von Compiler nicht als C-String-Typ sondern als Unicode-String-Typ gehandelt.

Interessanterweise scheint die Zuweisungsart über die Compilerbehandlung zu entscheiden:
Code:
WideString s1 = L"\x043F\x043E\x0442\x0435\x0440\x0438\x0442\x0435\x043F\x043B\x0430"
         L"\x043F\x043E\x0442\x0435\x0440\x0438 \x0442\x0435\x043F\x043B\x0430"
         L"\x043F\x043E\x0442\x0435\x0440\x0438 \x0442\x0435\x043F\x043B\x0430";
läßt kein späteres
Code:
s1 = s1 + "hallo"; //bzw.
s1 = s1 + L"\x0641";
zu (Out of Memory). Übergebe ich von hinten durch die Brust ins Auge
Code:
s1 = (WideString(wchar_t(0x0641)))+(WideString(wchar_t(0x0442)))+(WideString(wchar_t(0x043F)))+(WideString(wchar_t(0x043B)));
, kann ich diese Syntax s1 = s1 + irgendwas verwenden. Die Zuweisung läßt wiederum keinen Zeilenumbruch in der IDE zu.
Die Übergabe als Literal scheint also zur Behandlung als Literal mit einer festen Länge zu führen, während die Widestringvariante das Stringarray offen hält.
Ich habe mein Problem leider mit beidem nicht lösen können: beliebig lange Widestrings in der BCB6-IDE zuweisen und als WideString behandeln zu können.


Grüße, Messie

Olli 31. Dez 2006 17:03

Re: Unicode/WChar im BCB darstellen
 
Das ist putzig. Schonmal versucht operator+= und operator+ für WideString zu überladen?

messie 1. Jan 2007 09:48

Re: Unicode/WChar im BCB darstellen
 
Zitat:

Zitat von Olli
Das ist putzig. Schonmal versucht operator+= und operator+ für WideString zu überladen?

Geht auch wieder nur, wenn die Zuweisung ohne das Unicode-Literal passiert.

Edit: Andersrum gedacht. Wenn man der Übergabe des Literals ein Cast voranstellt, wird die Behandlung als Stringarray umgesetzt. Dem
Code:
WideString s1 = (WideString)L"\x043F\x043E\x0442\x0435\x0440\x0438\x0442\x0435\x043F\x043B\x0430"
         L"\x043F\x043E\x0442\x0435\x0440\x0438\x0442\x0435\x043F\x043B\x0430"
         L"\x043F\x043E\x0442\x0435\x0440\x0438\x0442\x0435\x043F\x043B\x0430"
         L"\x043F\x043E\x0442\x0435\x0440\x0438\x0442\x0435\x043F\x043B\x0430"
         L"\x043F\x043E\x0442\x0435\x0440\x0438\x0442\x0435\x043F\x043B\x0430"
         L"\x043F\x043E\x0442\x0435\x0440\x0438\x0442\x0435\x043F\x043B\x0430"
         L"\x043F\x043E\x0442\x0435\x0440\x0438\x0442\x0435\x043F\x043B\x0430";
läßt sich dann ein
Code:
s1 += (WideString)L"\x0472"
                    L"\x043F\x043E\x0442\x0435\x0440\x0438\x0442\x0435\x043F\x043B\x0430";
hinterherschicken.

Mir ist zwar nicht klar, warum es so läuft, es scheint es aber sauberer zu laufen. Die Versuche, der Literalvariante etwas anzuhängen wurde beim Debugging von häufig aufpoppenden CPU-Fenstern begleitet...

Grüße, Messie


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:09 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz