Vom Unicode zum char und zurück
-
Hi,
bin etwas neu in C++ und wollte mal fragen ob es in C++ einen plattformunabhängigen Befehl gibt von unicode(int) zu char und zurück verwandeln kann.Weis jemand, wo es eine übersicht aller "Grundbefehle" gibt, finde MSDN da nicht so passend.
mfg
Silencer
-
UltimateSilencer schrieb:
Weis jemand, wo es eine übersicht aller "Grundbefehle" gibt, finde MSDN da nicht so passend.
-
Vielen Dank

Und wie wandelt man einen char in einen int(unicode) um und umgedreht?
-
TheSilencer schrieb:
Vielen Dank

Und wie wandelt man einen char in einen int(unicode) um und umgedreht?meinst du?
char ch = 'X'; int nch = ch; char ch2 = nch;Grüssli
-
Genau das, habe jetzt mal mit anderen Dateitypen rumgespielt.
Warum geht das nicht:
std::string ch = 's'; // soll immer ein Buchstabe sein
int nch = ch;
std::string ch2 = nch;(sry bin php gewohnt das sieht man das nicht so eng)
-
Tach,
Soweit ich weiß ist Unicode nicht int sondern unsigned short (16 Bit breit)!
typedef unsigned short wchar_t;So jetzt zu deiner Frage:
Wenn du zwischen Unicode und dem "normalen" Zeichensatz umwandeln willst, dann musst du wissen, dass ...1.) Die ersten 128 Zeichen von Unicode (Codes 0x0000 bis 0x007F) direkt dem bekannten ASCII entsprechen
2.) Die nächsten 128 Zeichen (0x0080 bis 0x00FF) dem durch ISO 8859-1 festgelegten ASCII-Erweiterungen entsprechenWenn du also von ASCII zu Unicode willst und es nicht unnötig kompliziert machen willst:
char ascii = 'a'; wchar_t unicode = (wchar_t) ascii; oder: #define UNICODE // vor windows.h !!! char ascii = 'b'; TCHAR unicode = (TCHAR) ascii;In die andere Richtung macht es meiner Meinung nach absolut keinen Sinn, da char eben nur 8 Bit breit ist und wchar_t 16 Bit breit ist.
Wenn du also eine Unicode zeichen, das überhalb der ersten 256 Zeichen liegt in ASCII umwandelst kommt da nur Zeichensalat raus!
Und außerdem wäre das Unicode Zeichen nicht mehr wiederherstellbar (die letzten 8 Bit gehen beim Casten verloren).Wenn du aber beispielsweise n Unicode-String übers Internet verschicken willst und du Sockets verwenden willst (die soweit ich weiß nicht UNICODE-FÄHIG sind), dann würde ich dir empfehlen einfach einen doppelt so großen char-String zu nehmen und ne Funktion zu schreiben, die n Unicode-Zeichen in 2 mal 8 Bit aufspaltet und dann je ein Byte in ein char abspeichert.
Das gibt zwar auch Zeichensalat, aber der String ist wiederherstellbar.-> Ich seh grad, dass es schon ein Makro dafür gibt: LOBYTE und HIBYTE (ich dachte immer die Dinger gibts nur für Double-Words, tja ... man lernt immer dazu
)Gruß TheImaginator
-
Hallo
Umwandlung von wstring/string bzw wchar*/char* siehe hier.
Umwandlung string/char in int/float, siehe hier.
bis balöd
akari
-
TheImaginator schrieb:
Soweit ich weiß ist Unicode nicht int sondern unsigned short (16 Bit breit)!
typedef unsigned short wchar_t;[...]
In die andere Richtung macht es meiner Meinung nach absolut keinen Sinn, da char eben nur 8 Bit breit ist und wchar_t 16 Bit breit ist.Keine Ahnung woher du das hast, aber das ist Käse. Wahrscheinlich liest du zuviel MSDN.

wchar_t ist ein "echter" C++ Datentyp. Und wie der aussieht, ist implementationsspezifisch. Unter Windows zB ist der typischerweise 16 Bit breit, was einfach daran liegt, dass WinAPI UTF-16 unterstützt.
Ich weiss zwar nicht genau, was das konkrete Problem des OP ist. Aber für die Umwandlung von und in wchar_t Zeichen gibt es zB die Funktionen wctomb und mbtowc.