67 votes

Différence entre MBCS et UTF-8 sous Windows

Je suis de la lecture sur le personnage de définir et de codages sur Windows. J'ai remarqué qu'il y a deux drapeaux du compilateur de compilateur Visual Studio (C++) appelé MBCS et UNICODE. Quelle est la différence entre eux ? Ce que je ne suis pas arriver est de savoir comment l'UTF-8 est conceptuellement différent à partir d'un codage MBCS ? Aussi, j'ai trouvé la citation suivante dans MSDN:

Unicode est un codage de caractères 16 bits

Ceci évite de ce que j'ai lu à propos de l'Unicode. J'ai pensé unicode peuvent être encodés avec différents codages UTF-8 et UTF-16. Quelqu'un peut-il faire la lumière sur cette confusion?

112voto

dan04 Points 33306

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.

19voto

Jichao Points 5680

_MBCS et _UNICODE sont des macros pour déterminer la version de TCHAR.H routines d'appel. Par exemple, si vous utilisez _tcsclen à compter la longueur d'une chaîne, le préprocesseur serait la carte _tcsclen de version différente selon les deux macros: _MBCS et _UNICODE.

_UNICODE & _MBCS Not Defined: strlen  
_MBCS Defined: _mbslen  
_UNICODE Defined: wcslen  

Pour expliquer la différence de ces la longueur de la chaîne de comptage fonctions, considérons l'exemple suivant.
Si vous avez un ordinateur de la boîte qui exécutent Windows Chinois Simplifié édition qui utilisent GBK(936 code de la page), vous compilez un gbk-fichier-source codée fichier et de l'exécuter.

printf("%d\n", _mbslen((const unsigned char*)"I爱你M"));
printf("%d\n", strlen("I爱你M"));
printf("%d\n", wcslen((const wchar_t*)"I爱你M"));

Le résultat serait 4 6 3.

Voici la séquence hexadécimale de la représentation de l' I爱你M dans GBK.

GBK:             49 B0 AE C4 E3 4D 00                

_mbslen sait que cette chaîne est codée dans GBK, de sorte qu'il pourrait intepreter la chaîne correctement et obtenir le bon résultat 4 mots: 49 comme I, B0 AE comme , C4 E3 comme , 4D en tant que M.

strlen ne connaît 0x00, donc il se 6.

wcslen considérer cette hexdeciaml tableau est codé dans UTF16LE, et le compte à deux octets en un seul mot, donc il se 3 mots: 49 B0, AE C4, E3 4D.

11voto

stakx Points 29832

MBCS signifie Multi-Byte Character Set et décrit de caractère où un caractère est codé dans (peut-être) plus de 1 octet.

La norme ANSI / ASCII jeux de caractères ne sont pas multi-octets.

UTF-8, cependant, est un encodage multi-octet. Il encode n'importe quel caractère Unicode comme une séquence de 1, 2, 3, ou 4 octets (bytes).

Cependant, l'UTF-8 n'est qu'un parmi plusieurs possibles des codages du jeu de caractères Unicode. Notamment, UTF-16 est un autre, et se trouve être l'encodage utilisé par Windows / .NET (IIRC). Voici la différence entre UTF-8 et UTF-16:

  • UTF-8 code Unicode du caractère comme une séquence de 1, 2, 3 ou 4 octets.

  • UTF-16 code pour la plupart des caractères Unicode 2 octets, et certains comme 4 octets.

Il n'est donc pas correct qu'Unicode est un codage de caractères 16 bits. C'est plutôt quelque chose comme 21 bits de codage (ou même plus ces jours-ci), car elle englobe un ensemble de caractères avec des points de code, U+000000 jusqu'à U+10FFFF.

5voto

Chris Points 2318

Comme une note de bas de page pour les autres réponses, MSDN est un document Générique-Texte Mappages dans TCHAR.H à portée de main les tableaux résumant la façon dont les directives de préprocesseur _UNICODE et _MBCS modifier la définition de différents C/C++ types.

Comme pour le phrasé "Unicode" et "Multi-Byte Character Set", les gens ont déjà décrit quels en sont les effets. Je veux juste souligner que ces deux sont Microsoft-parler pour des choses très spécifiques. (Qui est, ils signifient quelque chose de moins général et plus particulièrement à Windows que l'on pourrait attendre si vous venez d'un pays non-Microsoft-spécifique de la compréhension de textes de l'internationalisation.) Ces phrases exactes de se montrer et ont tendance à obtenir leur propre sections/sous-sections de microsoft documents techniques, par exemple, dans le Texte et des Chaînes dans Visual C++

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X