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);