me di cuenta de que hay dos opciones del compilador en compilador de Visual Studio (por C++) llamados MBCS y Unicode. ¿Cuál es la diferencia entre ellos?
Muchas funciones de la API de Windows vienen en dos versiones: una que lleva char
parámetros (en una página de códigos específica para la localización) y uno que lleva wchar_t
parámetros (en UTF-16).
int MessageBoxA(HWND hWnd, const char* lpText, const char* lpCaption, unsigned int uType);
int MessageBoxW(HWND hWnd, const wchar_t* lpText, const wchar_t* lpCaption, unsigned int uType);
Cada uno de estos pares de función también tiene una macro sin el sufijo, que depende de si se define la macro UNICODE
.
#ifdef UNICODE
#define MessageBox MessageBoxW
#else
#define MessageBox MessageBoxA
#endif
Con el fin de hacer este trabajo, el tipo TCHAR
se define a abstraer el tipo de caracteres que utiliza las funciones de la API.
#ifdef UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif
Esto, sin embargo, was a bad idea. Siempre debe especificar explícitamente el tipo de carácter.
Lo que no estoy recibiendo es como UTF-8 es conceptualmente diferente de una codificación MBCS ?
MBCS significa "juego de caracteres multibyte". Para los de mente literal, parece que UTF-8 calificaría.
Pero en Windows, "MBCS" solo se refiere a las codificaciones de caracteres que se pueden usar con las versiones "A" de las funciones de la API de Windows. Esto incluye las páginas de códigos 932 (Shift_JIS), 936 (GBK), 949 (KS_C_5601-1987) y 950 (Big5), pero NOT UTF-8.
Para usar UTF-8, debe convertir la cadena a UTF-16 usando MultiByteToWideChar
, llamar a la versión "W" de la función y llamar al WideCharToMultiByte
en la salida. Esto es esencialmente lo que hacen las funciones "A", lo que me hace preguntarme why Windows doesn't just support UTF-8.
Esta incapacidad para admitir the most common character encoding hace que la versión "A" de la API de Windows sea inútil. Por lo tanto, debe utilizar siempre las funciones "W".
Unicode es una codificación de caracteres de 16 bits
Esto niega lo que leí sobre el Unicode.
MSDN está equivocado. Unicode es un conjunto de caracteres codificados de 21 bits que tiene varias codificaciones, siendo las más comunes UTF-8, UTF-16 y UTF-32. (También hay otras codificaciones Unicode, como GB18030, UTF-7 y UTF-EBCDIC.)
Siempre que Microsoft se refiera a "Unicode", realmente quieren decir UTF-16 (o UCS-2). Esto es por razones históricas. Windows NT fue uno de los primeros en adoptar Unicode, cuando se creía que 16 bits eran suficientes para todos, y UTF-8 solo se usaba en el Plan 9. Por lo tanto, UCS-2 era Unicode.
Gracias por la información muy útil. – Naveen
"Esto es para histórico" Me pregunto por qué no han reparado su documentación en los últimos> 15 años. – ybungalobill
Ellos son Microsoft. La historia es falsa La resistencia es inútil. – tripleee