AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Unicode/WChar im BCB darstellen

Ein Thema von messie · begonnen am 21. Dez 2006 · letzter Beitrag vom 1. Jan 2007
Antwort Antwort
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#1

Unicode/WChar im BCB darstellen

  Alt 21. Dez 2006, 14:52
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
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#2

Re: Unicode/WChar im BCB darstellen

  Alt 31. Dez 2006, 02:15
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 )
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#3

Re: Unicode/WChar im BCB darstellen

  Alt 31. Dez 2006, 06:21
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.
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#4

Re: Unicode/WChar im BCB darstellen

  Alt 31. Dez 2006, 06:48
Code:
L"\x043F\x043E\x0442\x0435\x0440\x0438 \x0442\x0435\x043F\x043B\x0430"
ist aber viel cplusplusiger ... 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 )

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

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#5

Re: Unicode/WChar im BCB darstellen

  Alt 31. Dez 2006, 12:39
Zitat von Olli:
Code:
L"\x043F\x043E\x0442\x0435\x0440\x0438 \x0442\x0435\x043F\x043B\x0430"
ist aber viel cplusplusiger ... 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
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#6

Re: Unicode/WChar im BCB darstellen

  Alt 31. Dez 2006, 13:41
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.
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#7

Re: Unicode/WChar im BCB darstellen

  Alt 31. Dez 2006, 14:54
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
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#8

Re: Unicode/WChar im BCB darstellen

  Alt 31. Dez 2006, 18:03
Das ist putzig. Schonmal versucht operator+= und operator+ für WideString zu überladen?
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#9

Re: Unicode/WChar im BCB darstellen

  Alt 1. Jan 2007, 10:48
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:55 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz