16

Wie konvertiere ich den Inhalt eines Platform :: String, der von Funktionen verwendet werden soll, die eine char * -basierte Zeichenfolge erwarten? Ich nehme an, dass WinRT Hilfsfunktionen dafür bereitstellt, aber ich kann sie einfach nicht finden.Wie konvertiert man Platform :: String in char *?

Danke!

+0

Sie können keine Konvertierung von UTF-16LE anfordern, es sei denn, Sie geben Ihre Zielzeichencodierung an. Was ist es? – IInspectable

Antwort

13

Platform::String::Data() wird eine wchar_t const* zurückgeben, die auf den Inhalt der Zeichenfolge verweist (ähnlich wie std::wstring::c_str()). Platform::String stellt eine unveränderliche Zeichenfolge dar, daher gibt es keinen Zugriff auf eine wchar_t*. Sie müssen den Inhalt kopieren, z. in eine std::wstring, um Änderungen vorzunehmen.

Es gibt keine direkte Weise eine char* oder eine char const* zu bekommen, weil Platform::String breite Zeichen verwendet (alle Metro-Stil apps sind Unicode-Anwendungen). Sie können zu Multibyte konvertieren, indem Sie WideCharToMultiByte verwenden.

+0

Gibt es irgendwelche Metro-spezifischen "indirekten" Methoden zum Konvertieren in char *? – djcouchycouch

+0

'WideCharToMultiByte' kann von einer Metro-App aufgerufen werden. –

+0

Ich verstehe. OK danke! – djcouchycouch

1

Es gibt die Methode String::Data, die const char16* zurückgibt. Dies ist die unformatierte Unicode-Zeichenfolge.

Umwandlung von Unicode zu Ascii oder was auch immer, d.h. char16* bis char*, ist eine andere Sache. Sie brauchen es wahrscheinlich nicht, da die meisten Methoden ihre wchar Versionen in diesen Tagen haben.

+2

Leider, weil ich nicht in einer Welt wchar lebe. Der Großteil des Codes, mit dem ich arbeite, ist Legacy-Code, der 8-Bit-Zeichenfolgen erwartet. :) – djcouchycouch

13

Hier ist eine sehr einfache Möglichkeit, dies in Code zu tun, ohne sich um Pufferlängen kümmern zu müssen. Nur diese Lösung verwenden, wenn Sie sicher sind Sie mit ASCII handelt:

Platform::String^ fooRT = "aoeu"; 
std::wstring fooW(fooRT->Begin()); 
std::string fooA(fooW.begin(), fooW.end()); 
const char* charStr = fooA.c_str(); 

Beachten Sie, dass in diesem Beispiel die char* auf dem Stapel befindet und gehen weg, sobald es Rahmen

+2

Für jedes Problem gibt es eine einfache, elegante Lösung. Und falsch. Wie dieser. Jedes Zeichen außerhalb des Bereichs von ASCII-Zeichen wird nur in eine zufällige Darstellung zerlegt, abhängig vom aktuellen Zustand des ausführenden Threads. ** Verwenden Sie diese Lösung nicht. ** (Was einfach ist, weil sie nicht einmal kompiliert wird.) – IInspectable

+0

Der Compilerfehler wurde behoben. PS: Immer noch eine nette Art der Konvertierung, wenn 100% sicher sind, dass Sie nur mit ASCII-Zeichen umgehen müssen – bas

1

A verlässt Lösung mit wcstombs:

Platform::String^ platform_string = p_e->Uri->AbsoluteUri; 
const wchar_t* wide_chars = platform_string->Data(); 
char chars[512]; 
wcstombs(chars, wide_chars, 512); 
5

Sie nicht ein breites Zeichen in ein Zeichen werfen sollte, werden Sie Sprachen mangle mehr als ein Byte pro Zeichen, zB Chinesisch. Hier ist die richtige Methode.

#include <cvt/wstring> 
#include <codecvt> 

Platform::String^ fooRT = "foo"; 
stdext::cvt::wstring_convert<std::codecvt_utf8<wchar_t>> convert; 
std::string stringUtf8 = convert.to_bytes(fooRT->Data()); 
const char* rawCstring = stringUtf8.c_str(); 
+0

Oder ein linear ohne stdext 'char * row = std :: wstring_convert >(). To_bytes (fooRT -> Data()). C_str(); ' – Quest

+2

Aber mit @ Quest Methode zeigt die' rohe' Variable auf freigegebenen Speicher (temporäres Objekt ist verschwunden, nachdem der Ausdruck ausgewertet wurde), wenn es wörtlich verwendet wird. Besser verwenden Sie 'std :: string utf8 = std :: wstring_convert >(). To_bytes (fooRT-> Daten())' wenn Sie nicht sicher sind, was Sie tun. –

Verwandte Themen