2010-12-08 31 views
12

¿Cómo puedo convertir std :: wstring en const * char en C++?convertir std :: wstring a const * char en C++

+1

Hay muchas maneras. Cuál es el adecuado para usted depende de una gran cantidad de hechos que no ha proporcionado. ¿Qué codificación quieres que tenga el resultado? ¿Qué plataforma/codificación de conversión lib estás utilizando? – sbi

+0

¿Qué sistema operativo? Al menos en Windows debes hacer esto raramente, p. si quieres escribir una cadena UTF-8 en un archivo. – Philipp

+0

Existe este "[Absoluto mínimo que todo desarrollador de software debe saber absolutamente absoluto sobre Unicode y conjuntos de caracteres (¡Sin excusas!)] (Http://www.joelonsoftware.com/articles/Unicode.html)", que debe leerse ! – Jaywalker

Respuesta

11

Puede convertir un std::wstring a un const wchar_t * utilizando la función de miembro de c_str:

std::wstring s; 
const wchar_t *str = s.c_str(); 

Sin embargo, una conversión a una const char * no es natural, sino que exige una llamada adicional a std::wcstombs.

+1

¿Puedes dar un ejemplo completo que incluya wcstombs? Estoy tratando de resolver esto de la manera que sugieres. –

+0

cuando el wstring es wStr: 'const wchar_t * str = wStr.c_str(); size_t size = wcslen (str) * 2 + 2; char * StartPoint = new char [size]; size_t c_size; wcstombs_s (& c_size, StartPoint, tamaño, str, tamaño); ' – arielhad

+0

@arielhad ¿Por qué +2 al final de la definición de tamaño? Además, esta 'fórmula' para el tamaño asume que char es de 8 bits, y wchar_t es de 16 bits, ¿no es así? Creo que sería mejor escribirlo llamando a sizeof() ya que no es necesariamente cierto para todas las plataformas. – KjMag

5

No puede hacer esto simplemente así. std::wstring representa una cadena de caracteres anchos (Unicode), mientras que char* en este caso es una cadena de caracteres ASCII. Tiene que haber una conversión de página de códigos de Unicode a ASCII.

Para realizar la conversión, puede usar las funciones de biblioteca estándar, como wcstombs, o la función de Windows 'WideCharToMultiByte.

Actualizado para incorporar información de los comentarios, gracias por señalarlo.

+1

biblioteca estándar maneja esto. Ver 'wcrtomb',' wcsrtombs', por ejemplo. – nothrow

+1

@Yossarian: El problema con las funciones de la biblioteca estándar es que el estándar no define qué conjunto de caracteres anchos, ni define qué juego de caracteres de varios bytes se usa en 'wcstombs'. Si necesita obtener la cadena en una codificación específica (como UTF-8), debe escribir la conversión usted mismo o usar una extensión específica de la plataforma (como WideCharToMultiByte) –

+0

std :: string puede contener unicode a través de UTF- 8 y std :: wstring no está casado con UTF-16/UTF-32. Entonces esta es una respuesta muy engañosa. – anno

Cuestiones relacionadas