Come convertire Platform :: String in char *?

Come faccio a convertire il contenuto di Platform :: String per essere utilizzato da funzioni che prevedono una stringa basata su char? Suppongo che WinRT fornisca funzioni di aiuto per questo, ma non riesco a trovarli.

Grazie!

Platform::String::Data() restituirà un wchar_t const* punta al contenuto della stringa (simile a std::wstring::c_str() ). Platform::String rappresenta una stringa immutabile, quindi non ci sono accessor per ottenere un wchar_t* . Dovrai copiare il suo contenuto, ad es. In std::wstring , per apportare modifiche.

Non esiste un modo diretto per ottenere un char* o un char const* perché Platform::String utilizza caratteri ampi (tutte le app in stile Metro sono app Unicode). Puoi convertire in multibyte usando WideCharToMultiByte .

Ecco un modo molto semplice per farlo in codice senza doversi preoccupare delle lunghezze del buffer. Utilizzare questa soluzione solo se si è certi di avere a che fare con ASCII :

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

Tieni presente che in questo esempio, il char* è in pila e andrà via una volta che lascia lo scope

Non si deve lanciare un carattere ampio a un carattere, si manipolano le lingue usando più di un byte per carattere, ad esempio il cinese. Ecco il metodo corretto.

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

C’è il metodo String::Data che restituisce const char16* , che è la stringa unicode raw.

La conversione da unicode ad ascii o qualsiasi altra cosa, ad esempio char16* in char* , è una questione diversa. Probabilmente non ne hai bisogno dato che la maggior parte dei metodi hanno le loro versioni di wchar questi giorni.

Una soluzione che utilizza 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);