2011-01-24 9 views
14

Soy un poco nuevo en el uso de Unicode cadena y punteros y no tengo idea de cómo funciona la conversión a unicode en ascii y versa-versa. Lo que sigue es lo que estoy tratando de hacer,Conversión de cadenas Unicode y viceversa

const wchar_t *p = L"This is a string"; 

Si quería convertirlo en char*, ¿cómo sería el trabajo de conversión con la conversión de wchar_t* a char* y viceversa?

o por valor utilizando wstring a string objeto de clase y viceversa

std::wstring wstr = L"This is a string"; 

Si estoy en lo cierto, puede que acaba de copiar la cadena a un nuevo buffer sin conversión?

Respuesta

3

Las soluciones dependen de la plataforma. En Windows use las funciones de API MultiByteToWideChar y WideCharToMultiByte. En las plataformas Unix/Linux iconv la biblioteca es bastante popular.

+0

Tenga en cuenta que 'MultiByteToWideChar' tiene un error al convertir la página de códigos 50225 (coreano - ISO-2022-KR) que convierte los caracteres incorrectamente como se indica en https://support.microsoft.com/en-us/kb/960293 - La solución sugerida es usar 'IMultiLanguage :: ConvertStringToUnicode' en su lugar, que convierte los mismos caracteres correctamente; actualice la respuesta para hacer que esto sea más visible. – Coder12345

3

C++ por sí solo no ofrece esta funcionalidad. Necesitará una biblioteca separada, como libiconv.

0

La ampliar() algoritmo convierte char a wchar_t:

char a; 
a = 'a'; 
whcar_t wa = cin.widen(a); 

Por supuesto, hay que ponerla en un bucle. Y resuelve el *; Lo opuesto se lleva a cabo por narrow()

+0

Eso solo funciona para ISO-8859-1. – dan04

22

En el futuro (VS 2010 ya lo soporta), esto será posible en C++ estándar (por fin!):

#include <string> 
#include <locale> 
#include <codecvt> 
std::wstring_convert<std::codecvt_utf8<wchar_t>> converter; 
const std::wstring wide_string = L"This is a string"; 
const std::string utf8_string = converter.to_bytes(wide_string); 
+4

Creo que hay un error tipográfico 'std :: wstring' en la última línea que debe ser' std: string' –

+1

Que la última línea debe ser 'std :: string': confirmada desde http://en.cppreference.com/ w/cpp/locale/wstring_convert/to_bytes –

+0

Como sabe, codecvt no es un encabezado estándar de C++. –

3

funciones de biblioteca C estándar: mbstowcs y wcstombs

3

La conversión de ASCII a Unicode y viceversa son bastante triviales. Por diseño, los primeros 128 valores Unicode son los mismos que los de ASCII (de hecho, los primeros 256 son iguales a ISO-8859-1).

Así que el siguiente código funciona en sistemas donde char es ASCII y Unicode es wchar_t:

const char* ASCII = "Hello, world"; 
std::wstring Unicode(ASCII, ASCII+strlen(ASCII)); 

No se puede revertir esta sencilla: 汉 existe en Unicode, pero no en ASCII, por lo que la forma en que lo haría "convertirlo"?

Cuestiones relacionadas