Vollständige Version anzeigen : [C++] char to wchar_t Konvertierung


Affje800
12.10.2013, 13:29

Hallo,

ich habe mal wieder ein super nerviges Problem. Ich muss ein normales char in ein wchar_t konvertieren. Das zeichen hole ich mir aus einem String


string lit = ... // spielt keine Rolle
char c = lit[0];


Bei Zeichen, die einen Dezimalwert <= 127 haben, ist die Konvertierung zu einem int kein Problem. Das große Problem sind Unicode-Zeichen, die auch unterstützt werden sollen.

Im Funktionsaufruf habe ich das Zeichen ß. Konvertiere ich das nach int (static oder reinterpret_cast, da hab ich schon alles versucht), schlägt das fehl und ich bekomme -97.

Also habe ich etwas gegoogled und bin auf den Typ wchar_t gestoßen, der seine Arbeit ganz gut verrichtet.

Schreibe ich nun zum Test


wchar_t c = L'ß';
cout << c << endl;


so wird mir auf der Konsole 223 ausgegeben, was dem Dezimalwert für das ß entspricht.
Das Problem ist nun, dass ich natürlich vor dem String nicht einfach ein L schreiben kann.
Ein einfacher Type-Cast mittels wchar_t g = wchar_t(lit[0]); funktioniert ebenfalls nicht (-61).

Wie bekomme ich denn nun (plattform- und compilerunabhängig!) das korrekte Ergebnis?
Würde mich über Hilfen sehr freuen.

MfG

Hardware Preisvergleich | Amazon Blitzangebote!

Videos zum Thema
Video Loading...
Murdoc
12.10.2013, 13:40

"ß" ist auch kein char, sondern zwei ;) *hint*


Affje800
12.10.2013, 14:06

"ß" ist auch kein char, sondern zwei ;) *hint*

Ja ist mir ja schon klar. Deshalb die Minus-Zahl. Ich bin ja auf den wchar-t (2-4 Bytes) umgestiegen, doch weiss nicht, wie ich da ein einfaches char konvertieren kann.

Bzw. ein string Zeichen für Zeichen in ein wchar_t-Array umwandeln, irgendeine Möglichkeit muss es doch geben, ohne das Prefix-L.


Murdoc
12.10.2013, 14:47

Der *hint* war wohl nicht deutlich genug...

"ß" besteht aus zwei chars (nach UTF-8): 0xC3 0x9F

So bekommst du den Codepoint raus für die zwei Bytes:
(Achung hardcoded)

#include <stdio;h>
#include <stdlib;h>

int main() {
char sz_utf8[] = "ß";

/* mit absicht nicht utf16 genannt! *HINT* (!!) */
wchar_t sz_16bit = ((sz_utf8[0] & 0x1F) << 6) | (sz_utf8[1] & 0x3F);

printf("%u\n", sz_16bit); /* 223 */

return 0;
}


Für ein vollständiges decoden von UTF-8 Zeichen nach UTF-16/32 bitte entsprechend selber recherchieren.


Affje800
12.10.2013, 16:27

Der *hint* war wohl nicht deutlich genug...

"ß" besteht aus zwei chars (nach UTF-8): 0xC3 0x9F

So bekommst du den Codepoint raus für die zwei Bytes:
(Achung hardcoded)

#include <stdio;h>
#include <stdlib;h>

int main() {
char sz_utf8[] = "ß";

/* mit absicht nicht utf16 genannt! *HINT* (!!) */
wchar_t sz_16bit = ((sz_utf8[0] & 0x1F) << 6) | (sz_utf8[1] & 0x3F);

printf("%u\n", sz_16bit); /* 223 */

return 0;
}


Für ein vollständiges decoden von UTF-8 Zeichen nach UTF-16/32 bitte entsprechend selber recherchieren;



Danke, funktioniert!

Edit: Glaube doch nicht. Für "statische" Zuweisungen gehts, für dynamische Zuweisungen leider nicht.


const char* sz_utf8 = lit;c_str();
wchar_t sz_16bit = ((sz_utf8[0] & 0x1F) << 6) | (sz_utf8[1] & 0x3F);
int value = static_cast<int>(sz_16bit); //(int)..
cout << value << endl;



Drei Aufrufe, ',' und ß:

448
448
223

Korrekt wäre aber 39, 39 und 223, oder nicht?
Ich HASSE dieses scheiss Zeiger-Umbiegen und Bitshifts in C++.


Murdoc
12.10.2013, 18:00

Du hast leider nicht verstanden was UTF-8 ist und wie man damit umgehen muss (mein Beispiel war hardcoded für die beiden octets von "ß").
Vor allem hast du den zweiten *HINT* wieder ignoriert. UTF-8 nach UTF-16 geht anders.

Bitte schau dir entsprechende Dokumentationen dazu an.
utf-8
utf-16
c++ utf-8 to utf-16

Im übrigen ist dein Code anfällig für array-out-of-bounds Fehler.


Affje800
12.10.2013, 18:23

Du hast leider nicht verstanden was UTF-8 ist und wie man damit umgehen muss (mein Beispiel war hardcoded für die beiden octets von "ß").
Vor allem hast du den zweiten *HINT* wieder ignoriert. UTF-8 nach UTF-16 geht anders.

Bitte schau dir entsprechende Dokumentationen dazu an.
utf-8
utf-16
c++ utf-8 to utf-16

Im übrigen ist dein Code anfällig für array-out-of-bounds Fehler;


Ich habe doch aber explizit im Eröffnungspost geschrieben, dass hardcoded Stuff null probleme darstellt, nu eben absolut nicht das ist, was ich brauche. Hardcoded kann ich einfach über wchar_t c = L'ß'; int v = (int)c; gehen und habe das gleiche Ergebnis.

Wofür dann den ganzen Kram mit Bitshifts? Das stackoverflow Beispiel werde ich mir mal anschauen, danke.

Btw. bewerten kann ich erst orgen, hab dich zuletzt bewertet, habe andere bewertet und muss nun warten ;)


Ähnliche Themen zu [C++] char to wchar_t Konvertierung
  • Konvertierung für den iPod Video
    Tag Leute, ich habe folgendes Problem: Wie ich hier hier (;;;ipodbuch~de/bonusmaterial/ipodvideo;html) entnehmen konnte muss ich bei den meisten meiner Filme und Musikvideos das Format ändern damit es auf dem iPod abzuspielen ist. Hier zu brauche ein Programm, wie z;B. den Quick Time Player, der [...]

  • dwg nach pdf-konvertierung leer
    hey, hab folgendes problem: wenn ich auf meinem rechner eine dwg datei (autocad-zeichnung) mit adobe acrobat 8;0 pro öffne, dann hab ich die zeichnung in der pdf-datei. wenn ich das aber auf meinem notebook mache, dann wird die datei zwar mit acrobat (gleiche version) geöffnet, allerdings is [...]

  • mit Konvertierung von Untertiteln
    Welchen Konverter haste benutzt? Versuch es mal mit nem andren. MfG Flofl [...]

  • Konvertierung zu Flash
    Hey Leute ich wollte fragen ob es ein Programm gibt das parallel zu meinem Webserver ( apache ) laufen würde und die wenn ich zum beispiel auf ne ;avi datei zugreif die direkt als Flash raus "streamt" . Hintergrund ist meine Wii mit der ich ja aufs Internet und Netzwerk zugreifen kann ich wollte da [...]



raid-rush.ws | Imprint & Contact pr