2009-02-02 20 views
6

Pregunta rápida sobre compatibilidad con UTF-8 y varias API de Win32.Compatibilidad con WinAPI y UTF-8

En un proyecto típico de C++ MFC, ¿es posible que MessageBox() muestre una cadena codificada en UTF-8?

Gracias, Andrew

Respuesta

8

respuesta rápida: Nº

Respuesta larga: Se va a trabajar si la cadena contiene sólo caracteres regulares ANSI, por ejemplo, US Inglés, ya que estos códigos de caracteres son los mismos en UTF -8 y ANSI.

Si se incluyen caracteres que no son ANSI, o caracteres codificados de doble byte, deberá transformar a Unicode-16 utilizando MultiByteToWideChar con CP_UTF8. Su programa también deberá compilarse con UNICODE definido, o puede usar las llamadas a la API 'W' - p. MessageBoxW.

(Tenga en cuenta que las funciones que toman un argumento de texto como MessageBox, CreateWindow se asignan a las versiones 'A' o 'W' dependiendo de si UNICODE está definido).

Esto también puede ser útil;

http://www.joelonsoftware.com/articles/Unicode.html

+1

Sólo un poco de terminología, pero se llama UTF -dieciséis. No hay tal cosa como Unicde-16. :) – jalf

+3

Este artículo de Joel es bastante antiguo y realmente minimiza UTF-8, que es la codificación Unicode más conveniente desde el punto de vista técnico. Sus propias ideas sobre cómo encontrar la metaetiqueta HTML solo funcionan con la codificación UTF-8 o con un solo byte (derivado de ASCII). De lo contrario, obtendrá bytes de valor cero en todo el lugar, lo que dificulta la búsqueda de caracteres '<'. En UTF-8 puede analizar XML (y HTML) sin preocuparse por Unicode, ya que garantiza que verá bytes <127 solo si codifican caracteres ASCII reales. – jpc

+0

También tenga en cuenta que gran parte de WinAPI es más como UCS-2, en lugar de UTF-16, en que al menos algunas partes de WinAPI (que? No tengo ni idea, todo parece ser bastante impredecible) ganó ' manejar los pares de sustitución correctamente; en otras palabras, supondrán que UTF-16 es una codificación de ancho fijo. –

4

No, utilizar MultiByteToWideChar con CP_UTF8. Consulte http://www.siao2.com/2006/10/11/816996.aspx para saber por qué A no puede hacerlo; W (UCS-2) es la única alternativa.

+0

+1 con poco nitpicking: la versión W es UTF-16, no UCS-2, también maneja parejas sustitutas. –

+0

Lo hace desde XP, sí. – Mark

+0

Para obtener más información sobre la diferencia, consulte http://blogs.msdn.com/michkap/416552.aspx – Mark

3

Uso las macros de conversión de cadenas ATL/MFC. Por ejemplo, si usted tiene una cadena ASCII llamado myUTF8Str que contienen caracteres UTF8:

::MessageBox(hWnd, CA2T(myUTF8Str, CP_UTF8), _T("Caption"), MB_OK); 

alternativa, se puede crear una instancia de la cadena, por ejemplo:

CA2T myConvertedString(myUTF8Str, CP_UTF8); 
... 
TRACE(_T("Converted: %s\n"), myUTF8Str.m_psz); 

Nota del miembro m_psz que permite sólo lectura acceso al puntero de cadena sin procesar.

También puede codificar utilizando CT2A, por ejemplo:

CT2A myEncodedString("Some UTF8", CP_UTF8); 

Si usted no utiliza macros de texto, a continuación, utilizar CA2W, CW2A, etc.