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
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 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;
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.
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.
Sólo un poco de terminología, pero se llama UTF -dieciséis. No hay tal cosa como Unicde-16. :) – jalf
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
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. –