Visual Studio Jeux de Caractères n'est Pas définie' vs 'Multi-byte character set"
J'ai travailler avec un héritage de l'application et je suis en train de travailler sur la différence entre les applications compilées avec Multi byte character set
et Not Set
en vertu de la Character Set
option.
Je comprends que la compilation avec Multi byte character set
définit _MBCS
qui permet multi-byte character set pages de code pour être utilisé, et à l'aide de Not set
ne définit pas _MBCS
, auquel cas un seul jeu de caractères codés sur les pages de code sont autorisés.
Dans le cas que Not Set
est utilisé, je suppose alors que l'on ne peut utiliser le jeu de caractères codés sur les pages de code trouvé sur cette page: http://msdn.microsoft.com/en-gb/goglobal/bb964654.aspx
Donc, ai-je raison de penser que est Not Set
est utilisé, l'application ne sera pas capable de coder et à écrire ou à lire les langues extrême-orientales depuis qu'ils sont définis dans le double byte character set pages de code (et bien sûr Unicode)?
Par la suite, si Multi byte character
jeu est défini, sont à la fois simples et multi-byte character set pages de code disponible, ou seulement multi-byte character set pages de code? J'imagine qu'il doit être à la fois pour les langues Européennes à être pris en charge.
Merci,
Andy
Lecture
Les réponses sur ces pages n'a pas répondu à ma question, mais qui a contribué à ma compréhension:
Sur le "jeu de Caractères" option dans visual studio 2010
Recherche
Donc, tout comme le travail de recherche... Avec mes paramètres régionaux définis comme les Japonais
Effet sur les chaînes codées en dur
char *foo = "Jap text: テスト";
wchar_t *bar = L"Jap text: テスト";
De la compilation avec Unicode
*foo = 4a 61 70 20 74 65 78 74 3a 20 83 65 83 58 83 67 == Shift-Jis (page de Code 932)
*bar = 4a 00 61 00 70 00 20 00 74 00 65 00 78 00 74 00 3a 00 20 00 c6 30 b9 30 c8 30 == UTF-16 ou UCS-2
De la compilation avec Multi byte character set
*foo = 4a 61 70 20 74 65 78 74 3a 20 83 65 83 58 83 67 == Shift-Jis (page de Code 932)
*bar = 4a 00 61 00 70 00 20 00 74 00 65 00 78 00 74 00 3a 00 20 00 c6 30 b9 30 c8 30 == UTF-16 ou UCS-2
De la compilation avec Not Set
*foo = 4a 61 70 20 74 65 78 74 3a 20 83 65 83 58 83 67 == Shift-Jis (page de Code 932)
*bar = 4a 00 61 00 70 00 20 00 74 00 65 00 78 00 74 00 3a 00 20 00 c6 30 b9 30 c8 30 == UTF-16 ou UCS-2
Conclusion:
L'encodage des caractères n'a aucun effet sur les chaînes codées en dur. Bien que la définition de caractères comme ci-dessus semble utiliser les paramètres Régionaux définis codepage et wchar_t semble utiliser UCS-2 et UTF-16.
À l'aide de chaînes codées en W/Une des versions de l'Api Win32
Donc, en utilisant le code suivant:
char *foo = "C:\\Temp\\テスト\\テa.txt";
wchar_t *bar = L"C:\\Temp\\テスト\\テw.txt";
CreateFileA(bar, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
CreateFileW(foo, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
De la compilation avec Unicode
Résultat: les Deux fichiers sont créés
De la compilation avec Multi byte character set
Résultat: les Deux fichiers sont créés
De la compilation avec Not set
Résultat: les Deux fichiers sont créés
Conclusion:
À la fois le A
et W
version de l'API s'attendre à la même quel que soit l'encodage du jeu de caractères choisi. À partir de cela, nous pouvons peut-être supposer que tous les Character Set
option permet de basculer entre la version de l'API. Ainsi, le A
version attend toujours les chaînes dans l'encodage de la page de code et la W
version attend toujours UTF-16 ou UCS-2.
De l'ouverture de fichiers à l'aide de W et Une Api Win32
Donc, en utilisant le code suivant:
char filea[MAX_PATH] = {0};
OPENFILENAMEA ofna = {0};
ofna.lStructSize = sizeof ( ofna );
ofna.hwndOwner = NULL ;
ofna.lpstrFile = filea ;
ofna.nMaxFile = MAX_PATH;
ofna.lpstrFilter = "Allchar filea[MAX_PATH] = {0};
OPENFILENAMEA ofna = {0};
ofna.lStructSize = sizeof ( ofna );
ofna.hwndOwner = NULL ;
ofna.lpstrFile = filea ;
ofna.nMaxFile = MAX_PATH;
ofna.lpstrFilter = "All\0*.*\0Text\0*.TXT\0";
ofna.nFilterIndex =1;
ofna.lpstrFileTitle = NULL ;
ofna.nMaxFileTitle = 0 ;
ofna.lpstrInitialDir=NULL ;
ofna.Flags = OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST ;
wchar_t filew[MAX_PATH] = {0};
OPENFILENAMEW ofnw = {0};
ofnw.lStructSize = sizeof ( ofnw );
ofnw.hwndOwner = NULL ;
ofnw.lpstrFile = filew ;
ofnw.nMaxFile = MAX_PATH;
ofnw.lpstrFilter = L"All\0*.*\0Text\0*.TXT\0";
ofnw.nFilterIndex =1;
ofnw.lpstrFileTitle = NULL;
ofnw.nMaxFileTitle = 0 ;
ofnw.lpstrInitialDir=NULL ;
ofnw.Flags = OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST ;
GetOpenFileNameA(&ofna);
GetOpenFileNameW(&ofnw);
*.*char filea[MAX_PATH] = {0};
OPENFILENAMEA ofna = {0};
ofna.lStructSize = sizeof ( ofna );
ofna.hwndOwner = NULL ;
ofna.lpstrFile = filea ;
ofna.nMaxFile = MAX_PATH;
ofna.lpstrFilter = "All\0*.*\0Text\0*.TXT\0";
ofna.nFilterIndex =1;
ofna.lpstrFileTitle = NULL ;
ofna.nMaxFileTitle = 0 ;
ofna.lpstrInitialDir=NULL ;
ofna.Flags = OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST ;
wchar_t filew[MAX_PATH] = {0};
OPENFILENAMEW ofnw = {0};
ofnw.lStructSize = sizeof ( ofnw );
ofnw.hwndOwner = NULL ;
ofnw.lpstrFile = filew ;
ofnw.nMaxFile = MAX_PATH;
ofnw.lpstrFilter = L"All\0*.*\0Text\0*.TXT\0";
ofnw.nFilterIndex =1;
ofnw.lpstrFileTitle = NULL;
ofnw.nMaxFileTitle = 0 ;
ofnw.lpstrInitialDir=NULL ;
ofnw.Flags = OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST ;
GetOpenFileNameA(&ofna);
GetOpenFileNameW(&ofnw);
Textchar filea[MAX_PATH] = {0};
OPENFILENAMEA ofna = {0};
ofna.lStructSize = sizeof ( ofna );
ofna.hwndOwner = NULL ;
ofna.lpstrFile = filea ;
ofna.nMaxFile = MAX_PATH;
ofna.lpstrFilter = "All\0*.*\0Text\0*.TXT\0";
ofna.nFilterIndex =1;
ofna.lpstrFileTitle = NULL ;
ofna.nMaxFileTitle = 0 ;
ofna.lpstrInitialDir=NULL ;
ofna.Flags = OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST ;
wchar_t filew[MAX_PATH] = {0};
OPENFILENAMEW ofnw = {0};
ofnw.lStructSize = sizeof ( ofnw );
ofnw.hwndOwner = NULL ;
ofnw.lpstrFile = filew ;
ofnw.nMaxFile = MAX_PATH;
ofnw.lpstrFilter = L"All\0*.*\0Text\0*.TXT\0";
ofnw.nFilterIndex =1;
ofnw.lpstrFileTitle = NULL;
ofnw.nMaxFileTitle = 0 ;
ofnw.lpstrInitialDir=NULL ;
ofnw.Flags = OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST ;
GetOpenFileNameA(&ofna);
GetOpenFileNameW(&ofnw);
*.TXTchar filea[MAX_PATH] = {0};
OPENFILENAMEA ofna = {0};
ofna.lStructSize = sizeof ( ofna );
ofna.hwndOwner = NULL ;
ofna.lpstrFile = filea ;
ofna.nMaxFile = MAX_PATH;
ofna.lpstrFilter = "All\0*.*\0Text\0*.TXT\0";
ofna.nFilterIndex =1;
ofna.lpstrFileTitle = NULL ;
ofna.nMaxFileTitle = 0 ;
ofna.lpstrInitialDir=NULL ;
ofna.Flags = OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST ;
wchar_t filew[MAX_PATH] = {0};
OPENFILENAMEW ofnw = {0};
ofnw.lStructSize = sizeof ( ofnw );
ofnw.hwndOwner = NULL ;
ofnw.lpstrFile = filew ;
ofnw.nMaxFile = MAX_PATH;
ofnw.lpstrFilter = L"All\0*.*\0Text\0*.TXT\0";
ofnw.nFilterIndex =1;
ofnw.lpstrFileTitle = NULL;
ofnw.nMaxFileTitle = 0 ;
ofnw.lpstrInitialDir=NULL ;
ofnw.Flags = OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST ;
GetOpenFileNameA(&ofna);
GetOpenFileNameW(&ofnw);
";
ofna.nFilterIndex =1;
ofna.lpstrFileTitle = NULL ;
ofna.nMaxFileTitle = 0 ;
ofna.lpstrInitialDir=NULL ;
ofna.Flags = OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST ;
wchar_t filew[MAX_PATH] = {0};
OPENFILENAMEW ofnw = {0};
ofnw.lStructSize = sizeof ( ofnw );
ofnw.hwndOwner = NULL ;
ofnw.lpstrFile = filew ;
ofnw.nMaxFile = MAX_PATH;
ofnw.lpstrFilter = L"Allchar filea[MAX_PATH] = {0};
OPENFILENAMEA ofna = {0};
ofna.lStructSize = sizeof ( ofna );
ofna.hwndOwner = NULL ;
ofna.lpstrFile = filea ;
ofna.nMaxFile = MAX_PATH;
ofna.lpstrFilter = "All\0*.*\0Text\0*.TXT\0";
ofna.nFilterIndex =1;
ofna.lpstrFileTitle = NULL ;
ofna.nMaxFileTitle = 0 ;
ofna.lpstrInitialDir=NULL ;
ofna.Flags = OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST ;
wchar_t filew[MAX_PATH] = {0};
OPENFILENAMEW ofnw = {0};
ofnw.lStructSize = sizeof ( ofnw );
ofnw.hwndOwner = NULL ;
ofnw.lpstrFile = filew ;
ofnw.nMaxFile = MAX_PATH;
ofnw.lpstrFilter = L"All\0*.*\0Text\0*.TXT\0";
ofnw.nFilterIndex =1;
ofnw.lpstrFileTitle = NULL;
ofnw.nMaxFileTitle = 0 ;
ofnw.lpstrInitialDir=NULL ;
ofnw.Flags = OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST ;
GetOpenFileNameA(&ofna);
GetOpenFileNameW(&ofnw);
*.*char filea[MAX_PATH] = {0};
OPENFILENAMEA ofna = {0};
ofna.lStructSize = sizeof ( ofna );
ofna.hwndOwner = NULL ;
ofna.lpstrFile = filea ;
ofna.nMaxFile = MAX_PATH;
ofna.lpstrFilter = "All\0*.*\0Text\0*.TXT\0";
ofna.nFilterIndex =1;
ofna.lpstrFileTitle = NULL ;
ofna.nMaxFileTitle = 0 ;
ofna.lpstrInitialDir=NULL ;
ofna.Flags = OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST ;
wchar_t filew[MAX_PATH] = {0};
OPENFILENAMEW ofnw = {0};
ofnw.lStructSize = sizeof ( ofnw );
ofnw.hwndOwner = NULL ;
ofnw.lpstrFile = filew ;
ofnw.nMaxFile = MAX_PATH;
ofnw.lpstrFilter = L"All\0*.*\0Text\0*.TXT\0";
ofnw.nFilterIndex =1;
ofnw.lpstrFileTitle = NULL;
ofnw.nMaxFileTitle = 0 ;
ofnw.lpstrInitialDir=NULL ;
ofnw.Flags = OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST ;
GetOpenFileNameA(&ofna);
GetOpenFileNameW(&ofnw);
Textchar filea[MAX_PATH] = {0};
OPENFILENAMEA ofna = {0};
ofna.lStructSize = sizeof ( ofna );
ofna.hwndOwner = NULL ;
ofna.lpstrFile = filea ;
ofna.nMaxFile = MAX_PATH;
ofna.lpstrFilter = "All\0*.*\0Text\0*.TXT\0";
ofna.nFilterIndex =1;
ofna.lpstrFileTitle = NULL ;
ofna.nMaxFileTitle = 0 ;
ofna.lpstrInitialDir=NULL ;
ofna.Flags = OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST ;
wchar_t filew[MAX_PATH] = {0};
OPENFILENAMEW ofnw = {0};
ofnw.lStructSize = sizeof ( ofnw );
ofnw.hwndOwner = NULL ;
ofnw.lpstrFile = filew ;
ofnw.nMaxFile = MAX_PATH;
ofnw.lpstrFilter = L"All\0*.*\0Text\0*.TXT\0";
ofnw.nFilterIndex =1;
ofnw.lpstrFileTitle = NULL;
ofnw.nMaxFileTitle = 0 ;
ofnw.lpstrInitialDir=NULL ;
ofnw.Flags = OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST ;
GetOpenFileNameA(&ofna);
GetOpenFileNameW(&ofnw);
*.TXTchar filea[MAX_PATH] = {0};
OPENFILENAMEA ofna = {0};
ofna.lStructSize = sizeof ( ofna );
ofna.hwndOwner = NULL ;
ofna.lpstrFile = filea ;
ofna.nMaxFile = MAX_PATH;
ofna.lpstrFilter = "All\0*.*\0Text\0*.TXT\0";
ofna.nFilterIndex =1;
ofna.lpstrFileTitle = NULL ;
ofna.nMaxFileTitle = 0 ;
ofna.lpstrInitialDir=NULL ;
ofna.Flags = OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST ;
wchar_t filew[MAX_PATH] = {0};
OPENFILENAMEW ofnw = {0};
ofnw.lStructSize = sizeof ( ofnw );
ofnw.hwndOwner = NULL ;
ofnw.lpstrFile = filew ;
ofnw.nMaxFile = MAX_PATH;
ofnw.lpstrFilter = L"All\0*.*\0Text\0*.TXT\0";
ofnw.nFilterIndex =1;
ofnw.lpstrFileTitle = NULL;
ofnw.nMaxFileTitle = 0 ;
ofnw.lpstrInitialDir=NULL ;
ofnw.Flags = OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST ;
GetOpenFileNameA(&ofna);
GetOpenFileNameW(&ofnw);
";
ofnw.nFilterIndex =1;
ofnw.lpstrFileTitle = NULL;
ofnw.nMaxFileTitle = 0 ;
ofnw.lpstrInitialDir=NULL ;
ofnw.Flags = OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST ;
GetOpenFileNameA(&ofna);
GetOpenFileNameW(&ofnw);
et en sélectionnant soit:
- C:\Temp\テスト\テopenw.txt
- C:\Temp\テスト\テopenw.txt
Rendements:
Lorsqu'il est compilé avec Unicode
*filea = 43 3a 5c 54 65 6d 70 5c 83 65 83 58 83 67 5c 83 65 6f 70 65 6e 61 2e 74 78 74 == Shift-Jis (page de Code 932)
*filew = 43 00 3a 00 5c 00 54 00 65 00 6d 00 70 00 5c 00 c6 30 b9 30 c8 30 5c 00 c6 30 6f 00 70 00 65 00 6e 00 77 00 2e 00 74 00 78 00 74
00 == UTF-16 ou UCS-2
Lorsqu'il est compilé avec Multi byte character set
*filea = 43 3a 5c 54 65 6d 70 5c 83 65 83 58 83 67 5c 83 65 6f 70 65 6e 61 2e 74 78 74 == Shift-Jis (page de Code 932)
*filew = 43 00 3a 00 5c 00 54 00 65 00 6d 00 70 00 5c 00 c6 30 b9 30 c8 30 5c 00 c6 30 6f 00 70 00 65 00 6e 00 77 00 2e 00 74 00 78 00 74
00 == UTF-16 ou UCS-2
Lorsqu'il est compilé avec Not Set
*filea = 43 3a 5c 54 65 6d 70 5c 83 65 83 58 83 67 5c 83 65 6f 70 65 6e 61 2e 74 78 74 == Shift-Jis (page de Code 932)
*filew = 43 00 3a 00 5c 00 54 00 65 00 6d 00 70 00 5c 00 c6 30 b9 30 c8 30 5c 00 c6 30 6f 00 70 00 65 00 6e 00 77 00 2e 00 74 00 78 00 74
00 == UTF-16 ou UCS-2
Conclusion:
Encore une fois, la Character Set
paramètre n'a pas une incidence sur le comportement de l'API Win32. Le A
version semble toujours retourner une chaîne de caractères avec l'encodage de la page de codes active et la W
on retourne toujours UTF-16 ou UCS-2. Je peux effectivement voir cela explique un peu dans cette grande réponse: https://stackoverflow.com/a/3299860/187100.
Ultime Conculsion
Hans semble être raison quand il dit que le définir n'est pas vraiment de la magie, au-delà de modification de l'Api Win32 pour utiliser W
ou A
. Par conséquent, je ne peux pas vraiment voir la différence entre Not Set
et Multi byte character set
.
OriginalL'auteur Andy | 2013-07-19
Vous devez vous connecter pour publier un commentaire.
Non, ce n'est pas vraiment la façon dont il fonctionne. La seule chose qui se passe est que la macro est défini, il n'a pas le contraire ont un effet magique sur le compilateur. Il est très rare d'écrire du code qui utilise
#ifdef _MBCS
pour tester cette macro.Vous avez presque toujours laisser place à une fonction d'assistance pour faire la conversion. Comme WideCharToMultiByte(), OLE2A() ou wctombs(). Qui sont des fonctions de conversion qui considèrent toujours multi-octets encodages, comme guidés par le code de la page. _MBCS est un accident historique, pertinentes à seulement 25 ans, lorsque le multi-octets encodages n'étaient pas encore monnaie courante. Tout comme en utilisant un non-codage Unicode est un artefact historique de ces jours.
Qui va à la force de votre éditeur de texte pour choisir un codage approprié pour le fichier de code source. En lui-même une source d'accidents. Si elle a choisi un codage Unicode, utf-8 est commun, vous êtes susceptible d'obtenir votre compilateur pour obtenir sulky à ce sujet. C4566 sur ma machine. Ne jamais considérer l'écriture comme ceci si vous vivez au Japon, et ne pas envisager de déplacer n'importe quand bientôt.
Ok, donc ça sonne comme je comprends un peu mieux maintenant. Les définitions ne sont pas vraiment faire beaucoup de choses, le code de la page est définie sur la machine, indépendamment de la façon dont une application est compilée, et le définit simplement changer l'Api Win32, et selon qu'il s'agit W ou Un, je suppose qu'il avait pour retourner à la page de code (multi-octets ou codés sur un seul jeu de caractères) codé des trucs (Un) ou UTF-16 (W)?
OriginalL'auteur Hans Passant
Dans le référence il est précisé que:
Comme vous l'avez deviné, en permettant
_MBCS
Visual Studio prend également en chargeASCII
jeu de caractères unique.Dans un deuxième référence, jeu de caractères unique semble être pris en charge, même si nous permettre
_MBCS
:_MBCS
ne sont pas les API en utilisant le jeu de caractères codés sur page de code basé sur les paramètres régionaux, tels que ceux définis à l': msdn.microsoft.com/en-gb/goglobal/bb964654.aspx? Ainsi, chacun de ceux qui commencent tous par la plage ASCII, mais ils vont à définir d'autres caractères étrangers.Oui, ASCII à 7 bits jeu de caractères à 128 caractères tout seul octet(8 bits) paramètres régionaux encodages peuvent coder 256 caractères.
yup, de sorte que les questions demeurent, si MBCS est défini, sont seul jeu de caractères codés sur les pages de codes exclus (et donc de dire des caractères thaïs)? Et si je compile sans MBSC, j'imagine que l'application ne serait pas en mesure de gérer d'extrême-orient caractères puisqu'il est limité à un seul jeu de caractères codés sur les pages de code>
selon la deuxième référence, il semble être pris en charge
OriginalL'auteur fatihk