std::string zu wchar_t[]
-
Hallo,
wie bekomme ich am besten ein wchar_t array aus einem std::string?
Ich habe mich schon oft gefragt wieso es für diverse windows.h Funktionen diverse verschiedene strings oder chars gibt. Ich könnte mir denken das die historisch gewachsen sind, aber hätte man sich da nicht auf was einheitliches einigen können?
LPCWSTR LPSTR LPTSTR... und so weiter..Gibt es darüber vlt irgendwo eine Übersicht? Vlt. ist es nicht mehr so verwirrend wenn man weiß wie die aufgebaut sind.
Dann könnte man sich selbst denken wie man dahin kommt.
-
cl90 schrieb:
Gibt es darüber vlt irgendwo eine Übersicht?
http://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspx
Zum Konvertieren:
string in("test"); int len = MultiByteToWideChar(CP_ACP, 0, in.c_str(), -1, 0, 0); WCHAR *res = new WCHAR[len]; MultiByteToWideChar(CP_ACP, 0, in.c_str(), -1, res, len);Der Rückgabewert von MultiByteToWideChar kann/sollte natürlich der Doku entsprechend überprüft werden.
-
danke, und bookmarked.
-
Welche Encodings willst du untereinander konvertieren? Willst du einfach die ASCII-Zeichen in
wchar_t's pressen? Dann reicht schonstd::wstring wstr( in.begin(), in.end() );Du kannst aber natürlich auch, falls irgendein Multibyte-Encoding in dem String gespeichert ist,
std::mbstowcsverwenden:std::string mbstr = u8"z\u00df\u6c34\U0001d10b"; std::wstring wstr(5, L'\0'); std::mbstowcs(&wstr[0], &mbstr[0], wstr.size());Und seit C++11 gibt es auch
wstring_convertund diecodecvt-Facets, mit denen man zwischen verschiedenen UTF-Formaten konvertieren kann.@Belli: Kannst du
std::wstringin deinem Code benutzen, anstatt das selber zu allozieren?
-
Hab ich in meiner Funktion gemacht. Der TE wollte aber ausdrücklich ein array haben.
Also einfach:
wstring s(res); delete[] res;anhängen, dann sollte es ganz sauber sein.
-
Der TE wollte aber ausdrücklich ein array haben.
Manchmal muss man die Menschen zum Glück zwingen

-
-
Belli schrieb:
Hab ich in meiner Funktion gemacht. Der TE wollte aber ausdrücklich ein array haben.
Also einfach:
wstring s(res); delete[] res;anhängen, dann sollte es ganz sauber sein.
Nein! Das ist nicht Exception-safe!
-
Nein! Das ist nicht Exception-safe!
Wenn
wstringschonbad_allocschmeißt, dann kann mir der Rest des Programmablaufs (der in der Regel gerade aus dem Grund dieses Exception-Wurfs deutlich verkürzt wird) ziemlich egal sein - daher ist es praktisch exception-safe.
-
Arcoth schrieb:
Nein! Das ist nicht Exception-safe!
Wenn
wstringschonbad_allocschmeißt, dann kann mir der Rest des Programmablaufs (der in der Regel gerade aus dem Grund dieses Exception-Wurfs deutlich verkürzt wird) ziemlich egal sein - daher ist es praktisch exception-safe.+1
Mein new-Handler ruft einfach exit auf. at_exit_handler flushen noch schön einige Logs und das wars auch.
-
Arcoth schrieb:
Nein! Das ist nicht Exception-safe!
Wenn
wstringschonbad_allocschmeißt, dann kann mir der Rest des Programmablaufs (der in der Regel gerade aus dem Grund dieses Exception-Wurfs deutlich verkürzt wird) ziemlich egal sein - daher ist es praktisch exception-safe.Ja, das
gutealte "warum einfach und korrekt, wenn es auch kompliziert und falsch geht".
-
Kellerautomat schrieb:
Nein! Das ist nicht Exception-safe!
Okay. Dann nehme man einen unique_ptr für res.
-
TyRoXx schrieb:
Ja, das
gutealte "warum einfach und korrekt, wenn es auch kompliziert und falsch geht".
Ich habe selbst vorgeschlagen, string zu nehmen statt irgendein Array anzulegen.
-
Aber die Windows-Funktion verlangt einen Pointer auf einen nicht-konstanten Bereich.
-
&str[0]