16

¿Cómo convierto el contenido de una Platform :: String para ser utilizado por funciones que esperan una cadena basada en char *? Supongo que WinRT proporciona funciones de ayuda para esto, pero no puedo encontrarlos.Cómo convertir Platform :: String a char *?

Gracias!

+0

No puede solicitar una conversión de UTF-16LE, a menos que especifique la codificación de caracteres de destino. ¿Qué es? – IInspectable

Respuesta

13

Platform::String::Data() devolverá un puntero que wchar_t const* al contenido de la cadena (similar a std::wstring::c_str()). Platform::String representa una cadena inmutable, por lo que no hay acceso para obtener un wchar_t*. Deberá copiar sus contenidos, p. en un std::wstring, para hacer cambios.

No hay forma directa de obtener una char* o una char const* porque Platform::String utiliza caracteres anchos (todas las aplicaciones estilo Metro son aplicaciones Unicode). Puede convertir a multibyte usando WideCharToMultiByte.

+0

¿Hay algún método "indirecto" específico de Metro para convertir a char *? – djcouchycouch

+0

'WideCharToMultiByte' se puede llamar desde una aplicación de estilo Metro. –

+0

Ya veo. ¡Vale gracias! – djcouchycouch

1

Existe el método String::Data que devuelve const char16*, que es la cadena unicode sin procesar.

La conversión de unicode a ascii o lo que sea, es decir, char16* a char*, es una cuestión diferente. Probablemente no lo necesite ya que la mayoría de los métodos tienen sus versiones wchar en estos días.

+2

Ay, porque no vivo en un mundo de wchar. La mayor parte del código con el que estoy trabajando es un código heredado que espera cadenas de caracteres de 8 bits. :) – djcouchycouch

13

Aquí hay una forma muy simple de hacerlo en código sin tener que preocuparse por la longitud del búfer. Sólo use esta solución si está seguro de que se trata de ASCII:

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

Tenga en cuenta que en este ejemplo, el char* está en la pila y desaparecen una vez que se deja un margen

+2

Para cada problema, hay una solución, es simple, elegante. Y mal. Como éste. Cualquier carácter que esté fuera del rango de caracteres ASCII será destruido en una representación aleatoria, dependiendo del estado actual de los hilos de ejecución. ** No use esta solución. ** (Lo cual es fácil, porque ni siquiera compila). – IInspectable

+0

Se corrigió el error del compilador. PD: sigue siendo una buena forma de conversión si está 100% seguro de que solo tiene que ocuparse de los caracteres ASCII – bas

1

Un solución utilizando 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

usted no debe emitir un carácter ancho a un char, se mangle idiomas que utilizan más de un byte por carácter, por ejemplo, Chino. Este es el método correcto.

#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

o uno lineal sin usar stdext 'char * raw = std :: wstring_convert >(). To_bytes (fooRT -> Datos()). C_str(); ' – Quest

+2

Pero usando el método de @ Quest, la variable' raw' apuntará a la memoria desasignada (el objeto temporal se va después de que se evalúa la expresión) si se usa literalmente. Mejor uso 'std :: string utf8 = std :: wstring_convert >(). To_bytes (fooRT-> Data())' a menos que esté seguro de lo que está haciendo. –