Konvertieren char in wchar_t

fujitsufan

Erfahrenes Mitglied
Hallo,
ich werd´verrückt.

Für die GDI+ Methode graphics.DrawString(const WCHAR *wtext, , , ,); brauche ich einen Text vom Typ wchar_t.

Diesen Text habe ich als char Array (char atext[260]) zur Verfügung.

Bei der manuellen Convertierung
Code:
//Convert char to a wchar_t*
    size_t convertedChars = 0;
    wchar_t wcstring[260];
    mbstowcs_s( &convertedChars, wtext, strlen( atext) + 1, atext, _TRUNCATE);
wie auch über die GDI+ Methode, vorher natürlich den atext in den (String) textToDraw konvertiert
Code:
graphics.DrawString(StringUtilities::toWString(textToDraw).c_str(), , , ,);
gehen allen Zeichen vom ascii Wert 127 bis 160 verloren.
Diese werden einfach nicht in WCHAR konvertiert. Allen anderen schon.

Was habe ich da nicht beachtet?

mfG.
fujitsufan
 
Hi.

Die "C" Standard-Locale verwendet 7bit ASCII.

Verwende die _mbstowcs_s_l um explizit eine Locale anzugeben.

Welche Kodierung (Code Page) verwendest du in deinem String? Falls ANSI, spezifiere ".ACP", falls OEM, nimm ".OCP" für die _create_locale Funktion.

Gruß
 
Hallo deepthroat,

wozu brauche ich die "_create_locale"?
Tuts die mbstowc_s( , , , ); nicht auch?

mfG.
fujitsufan
 
Hallo fujitsufan,

mbstowc_s verwendet die standard-locale und diese benutzt 7bit ASCII. 7 Bit gibt dir halt einfach keine höheren Werte, daher fallen die über 127 "weg". Daher musst du eine Locale angeben, die eine entsprechende Codepage hat. Das kannst du via _create_locale machen.

Alternativ kannst du ja gleich die API-Funktion von Windows verwenden:
MultiByteToWideChar

Du kannst da die Codepage direkt angeben.

Gruss
Muepe
 
Hallo,

hat funktioniert.

Code:
//Text in MultiByte Characterarray konvertieren
   memset(wcstring, 0, sizeof(wcstring));
   MultiByteToWideChar(CP_ACP, MB_COMPOSITE, textToDraw.c_str(), -1, wcstring, sizeof(wcstring) );

   // Draw string.
   Status status = graphics.DrawString(wcstring, textToDraw.length(), &myFont,layoutRect, &format, &brush);

Vielen Dank!
Gruß fujitsufan
 
Zurück