J'ai remarqué qu'il y a deux compilateur
drapeaux dans le compilateur Visual Studio (pour
C++) appelé MBCS et UNICODE. Qu'est-ce que
la différence entre eux ?
De nombreuses fonctions de l'API Windows sont disponibles en deux versions: l'Une qui prend char
paramètres (dans les paramètres régionaux spécifiques à la page de code) et qui prend wchar_t
paramètres (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);
Chacune de ces paires a aussi une macro sans le suffixe, qui dépend de l' UNICODE
macro est définie.
#ifdef UNICODE
#define MessageBox MessageBoxW
#else
#define MessageBox MessageBoxA
#endif
Afin de rendre ce travail, l' TCHAR
type est défini à l'abstraction du type de caractère utilisé par les fonctions de l'API.
#ifdef UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif
Ceci, cependant, était une mauvaise idée. Vous devez toujours spécifier explicitement le type de caractère.
Ce que je ne suis pas arriver est de savoir comment l'UTF-8 est
conceptuellement différent d'une MBCS
l'encodage ?
CMB est l'acronyme de "multi-byte character set". Pour le littéral à l'esprit, il semble que l'UTF-8 serait admissible.
Mais dans Windows, "CMB" se réfère uniquement à des codages de caractères qui peuvent être utilisés avec la "Une" des versions des fonctions de l'API Windows. Cela inclut les pages de code 932 (Shift_JIS), 936 (GBK), 949 (KS_C_5601-1987), et 950 (Big5), mais PAS de l'UTF-8.
Pour utiliser l'UTF-8, vous devez convertir la chaîne en UTF-16 à l'aide de MultiByteToWideChar
, appelez-le "W" de la version de la fonction, et appelez - WideCharToMultiByte
sur la sortie. C'est essentiellement ce que la "Une" des fonctions réellement faire, qui me fait me demander pourquoi Windows n'est pas seulement de support de l'UTF-8.
Cette incapacité à soutenir le personnage le plus commun de codage fait la "Une" version de l'API de Windows inutiles. Par conséquent, vous devez toujours utiliser le "W" de fonctions.
Unicode est un codage de caractères 16 bits
Ceci évite de tout ce que j'ai lu sur le
Unicode.
MSDN est faux. Unicode est de 21 bits de caractères codés sur plusieurs encodages, la plus commune étant en UTF-8, UTF-16 et UTF-32. (Il y a d'autres encodages Unicode, comme GB18030, UTF-7, et UTF-EBCDIC.)
Chaque fois que Microsoft fait référence à "Unicode", ils veulent dire en UTF-16 (ou UCS-2). C'est pour des raisons historiques. Windows NT a été l'un des premiers utilisateurs de l'Unicode, quand 16 bits a été pensé pour être assez pour tout le monde, et UTF-8 a été utilisé uniquement sur le Plan 9. Donc, UCS-2 a été Unicode.