Pregunta

¿Cómo obtengo un viejo programa MFC VC ++ 6.0 para leer y mostrar UTF8 en un TextBox o MessageBox? Preferiblemente sin romper ninguno de los archivos de lectura y visualización que está actualmente escrito allí (bastante sustancial).

Leí una línea en CString strStr, luego usé este código:

int nLengthNeeded = MultiByteToWideChar(CP_UTF8,0,strStr,1024,0,0);
wchar_t * pWCMessage = new wchar_t[ nLengthNeeded ];

MultiByteToWideChar(CP_UTF8,0,strStr,1024,pWCMessage,nLengthNeeded);

nLengthNeeded = MultiByteToWideChar(CP_UTF8,0,"Error Title",50,0,0);
wchar_t * pWCTitle = new wchar_t[ nLengthNeeded ];
MultiByteToWideChar(CP_UTF8,0,"Error Title",50,pWCTitle,nLengthNeeded);

MessageBoxW(NULL,pWCMessage,pWCTitle,MB_ICONINFORMATION);

Todavía no estoy seguro de cómo lo pondría en un cuadro de texto, pero resulta que no necesito hacer eso de todos modos.

¿Fue útil?

Solución

Siento que esto no será útil, pero es un punto de partida ... Supongo que no 'solo funciona', y no creo que quieras intentar joder con código loco páginas que pueden o no obtener lo que quieres.

¿Qué tal si usamos MultiByteToWideChar (CP_UTF8, ...) para convertirlo a utf16 y luego llamar a las versiones W de esas funciones (o definir UNICODE / _UNICODE para el proyecto).

Sé que funcionará para MessageBox, y no puedo imaginar que el cuadro de texto no tenga soporte Unicode.

Si necesita volver a enviar la salida a UTF8, simplemente use WideCharToMultiByte ().

Otros consejos

mira:

widechartomultibyte y para obtener información más general

cuando / si tiene problemas, asegúrese de publicar su código. Ha pasado un tiempo desde que hice eso y recuerdo que fue un poco complicado.

Convierta la cadena utf8 primero en una cadena ancha con la API MultiByteToWideChar , pasando CP_UTF8 para el parámetro de la página de códigos. Si su aplicación está compilada con _UNICODE definido, ahora puede pasar la cadena ancha a su cuadro de texto.

Sin embargo, si su aplicación se compila como una aplicación MBCS, debe convertir la cadena ancha de nuevo a MBCS con WideCharToMultiByte , pasando CP_ACP como parámetro de la página de códigos.

¿Es su aplicación Unicode? En caso afirmativo, recurra a la respuesta de Stefan:

MyDisplayableUtf16String = MultiByteToWideChar (CP_UTF8, MyUtf8String, ...)

Asumiré que no es tan simple: su aplicación es ANSI. En primer lugar, debe convertir la cadena a UTF16 como se muestra arriba. Luego hay un cuello de botella: ¿su cadena UTF8 contiene caracteres fuera de la página de códigos del sistema actual (también conocido como "Idioma para aplicaciones no Unicode")? De lo contrario, convierta la cadena UTF16 a la configuración regional del sistema utilizando

MyGoodOldAnsiString = WideCharToMultiByte(CP_ACP,MyUtf16String,...)

(o use una de las macros ATL / MFC, como W2A (MyUtf16String) )

y listo.

De lo contrario, la cadena no se puede convertir a ANSI, lo que significa que tendrá un ... ejem ... difícil intentar mostrarlo en un cuadro de texto o cuadro de mensaje ANSI.

Como señaló Joe, puede mostrar el texto en un cuadro de mensaje usando

MessageBoxW (..., MyDisplayableUtf16String, ...)

La W final indica la versión Unicode (UTF16) de la API.

Sin embargo, la visualización de la cadena en un cuadro de texto seguirá siendo difícil: necesitaría crear programáticamente el cuadro de texto como una ventana Unicode usando CreateWindowExW () . Lo que creo que no funcionará si la ventana principal del cuadro de texto (diálogo, marco?) No es una ventana Unicode.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top