Autor Beitrag
Aya
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: Do 29.01.09 09:55 
Hi,

es gibt ja von vielen WinAPI befehlen einmal die A und die W variante, A für ANSI Strings und W eben für Unicode.

Früher habe ich einfach entweder die A-Funktion genommen, oder wenn es W sein mußte meinen char* String mit diversen funktionen konvertiert..

Jetzt habe ich allerdings meine String-Klasse welche intern mit UTF-8, UTF-16 und UTF-32 arbeiten kann. Und als ich eben gesehen habe das ich - aus faulheit damals - bei CreateWindowExW immernoch das ganze via konvertiern mache (Ich wandele meinen UTF-8 String in char* um, nur um ihn dann wieder in Unicode zu konverteren :roll: ) kam ich auf die idee: Wieso gebe ich nicht direkt meinen Unicode String weiter?

Problem hierbei ist, wie genau müßen die daten im speicher dafür aussehen? Windows arbeitet da ja mit UTF-32 soweit ich weiß, sprich pro zeichen einen 32bit Integer wert.. aber wie schaut es aus mit der länge des Strings? Ist das immernoch so wie bei ANSI Strings, sprich eine 0x0 an's ende?

Oder ist wchar_t intern doch irgendwie ganz anders definiert?

Hilfe..

Aya~

_________________
Aya
I aim for my endless dreams and I know they will come true!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 29.01.09 10:45 
Deine Annahmen stimmen nicht so ganz.

W steht für Wide-Char und wchar_t ist intern (bzw. per typedef) als short (d.h. 16 bit bzw. 2 Byte) definiert.
Aber das Ende eines Strings ist dabei immer noch gleich, d.h. null-terminiert (nur bei Wide-Chars eben zwei Bytes).

Wenn du jedoch UTF-8 Strings hast, so kannst du diese nicht direkt übergeben, sondern mußt sie entsprechend umwandeln. Dafür gibt es verschiedene Libraries, z.B. utfcpp.sourceforge.net/
Aya Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: Do 29.01.09 11:49 
Hi,

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
W steht für Wide-Char und wchar_t ist intern (bzw. per typedef) als short (d.h. 16 bit bzw. 2 Byte) definiert.
Aber das Ende eines Strings ist dabei immer noch gleich, d.h. null-terminiert (nur bei Wide-Chars eben zwei Bytes).

Okay, danke. Das war genau was ich wissen wollte :)

Aya

_________________
Aya
I aim for my endless dreams and I know they will come true!
Aya Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: Do 29.01.09 13:00 
Mhh... ich hab jetzt meinen UTF-16 String der am ende mit 0 terminiert ist an CreateWindowExW als Caption übergeben, aber die zeichen in der Caption vom Fenster was erstellt wird sind bei weitem nicht das was sie sein sollten.. (Es sollte eigentlich "Das ist ein Test" dastehen, stattdessen sind 3 kryptische zeichen da...)

Der UTF-16 String ist aufjedenfall 100% korrekt encoded... was könnte denn da das problem sein? :/

EDIT: Ah ne schon gut, war mein fehler :)

_________________
Aya
I aim for my endless dreams and I know they will come true!
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Do 29.01.09 13:15 
user profile iconAya hat folgendes geschrieben Zum zitierten Posting springen:
EDIT: Ah ne schon gut, war mein fehler :)
Wär schön zu wissen, was der Fehler war, damit auch andere daraus lernen können :zustimm:

Edit: Oh, C++, schade, ich hatte Delphi erwartet - dann wär ich am Ergebnis nämlich wesentlich interessierter gewesen ;)

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
Aya Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: Do 29.01.09 13:19 
user profile iconJayEff hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconAya hat folgendes geschrieben Zum zitierten Posting springen:
EDIT: Ah ne schon gut, war mein fehler :)
Wär schön zu wissen, was der Fehler war, damit auch andere daraus lernen können :zustimm:

Edit: Oh, C++, schade, ich hatte Delphi erwartet - dann wär ich am Ergebnis nämlich wesentlich interessierter gewesen ;)


War im endeffekt nur ein dämlicher pointer fehler den ich gemacht hab :)
Ich hatte als einen Pointer auf meine UTF16String Klasse übergeben und vergessen in dieser den &-Operator zu überschreiben.. dadurch kam bei CreateWindowExW halt ein Poiner auf meine klasse an statt auf den UTF16-String selbst ^^

Aya~

PS: Was genau hätte dich denn daran interessiert? Evtl kann ich trotzdem helfen :)

_________________
Aya
I aim for my endless dreams and I know they will come true!
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Do 29.01.09 13:24 
user profile iconAya hat folgendes geschrieben Zum zitierten Posting springen:
PS: Was genau hätte dich denn daran interessiert? Evtl kann ich trotzdem helfen :)
Ach nichts, ich find nur Ergebnisse lustig, die zu funktionieren scheinen, bis man merkt, dass die Ausgabe nur kryptisch ist :)

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
Aya Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: Do 29.01.09 13:58 
Hrm, zufrüh gefreut...

Wenn ich ihm jetzt den String "Das ist ein Test" als UTF-16 codiert gebe, steht in der Caption nur "D".. wenn ich mir die einzelnen short-ints ausgeben lasse ist aber alles richtig, also die 0 ist erst am ende vom Satz..

Woran kann denn das liegen? :(

Am Pointer liegt es aufjedenfall nichtmehr..

_________________
Aya
I aim for my endless dreams and I know they will come true!
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Do 29.01.09 14:03 
Wenn in der Caption nur ein D steht, dann wird höchstwahrscheinlich irgendwo in der Kette der Aufrufe das als PChar (oder wie das bei c++ sonst heißt, eben als Ansi-String) interpretiert. Denn das zweite Byte von dem zwei-Byte-Zeichen "D" ist ein Nullbyte, was bei einem PChar das Terminierungssymbol ist.

_________________
We are, we were and will not be.
Aya Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: Do 29.01.09 14:05 
user profile iconGausi hat folgendes geschrieben Zum zitierten Posting springen:
Wenn in der Caption nur ein D steht, dann wird höchstwahrscheinlich irgendwo in der Kette der Aufrufe das als PChar interpretiert. Denn das zweite Byte von dem zwei-Byte-Zeichen "D" ist ein Nullbyte, was bei einem PChar das Terminierungssymbol ist.

Mh stimmt, das wäre plausibel.. aber wo? :/

_________________
Aya
I aim for my endless dreams and I know they will come true!
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Do 29.01.09 14:11 
Das kann ich dir ohne Code auch nicht sagen. ;-)

Irgendwo wird wohl noch eine Ansi-Api-Funktion aufgerufen, d.h. es fehlt einfach irgendwo ein "W". :nixweiss:

_________________
We are, we were and will not be.
Aya Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: Do 29.01.09 20:37 
Klappt jetzt, ich mußte in den compiler-optionen erst noch UNICODE Support aktivieren.. :roll:

Allerdings hab ich jetzt noch ein anderes problem.. wie kann ich denn file-streams (ifstream, ofstream) mit Unicode zeichen verwenden? Unter Windows gibt es dafür wohl sowas wie wofstream und wifstream, allerdings brauche ich es Platformunabhängig.. :)

Aya~

_________________
Aya
I aim for my endless dreams and I know they will come true!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 30.01.09 10:49 
wifstream und wofstream sind nur typedefs, d.h. diese funktionieren auch unter Linux etc:
ausblenden Quelltext
1:
2:
typedef basic_ifstream<wchar_t, char_traits<wchar_t> > wifstream;
typedef basic_ofstream<wchar_t, char_traits<wchar_t> > wofstream;