Наборы символов Visual Studio "не задано" vs "Многобайтовый набор символов"
я работаю с устаревшим приложением, и я пытаюсь выяснить разницу между приложениями, скомпилированными с Multi byte character set
и Not Set
под .
я понимаю, что компиляция с Multi byte character set
определяет _MBCS
что позволяет использовать многобайтовые кодовые страницы набора символов и использовать Not set
не определяет _MBCS
, в этом случае допускаются только однобайтовые кодовые страницы набора символов.
в случае, если это, я полагаю, тогда мы можем использовать только однобайтовые кодовые страницы набора символов, найденные на этой странице:http://msdn.microsoft.com/en-gb/goglobal/bb964654.aspx
поэтому я прав, думая, что это Not Set
используется, приложение не сможет кодировать и писать или читать дальневосточные языки, поскольку они определены в двухбайтовых кодовых страницах набора символов (и, конечно, Unicode)?
после этого, если Multi byte character
set определен, оба одиночные и многобайтовую кодировку на страницах кодекса, или только многобайтовую кодировку страниц кода? Я предполагаю, что это должно быть как для европейских языков, которые будут поддерживаться.
спасибо,
Энди
Более Дальнеишее Чтение
ответы на этих страницах не ответили на мой вопрос, но помогло в моем понимании: о опции "набор символов" в visual studio 2010
исследования
Итак, так же, как рабочие исследования... С мой язык, японский
влияние на жестко закодированные строки
char *foo = "Jap text: テスト";
wchar_t *bar = L"Jap text: テスト";
компиляция с Unicode
*foo = 4a 61 70 20 74 65 78 74 3a 20 83 65 83 58 83 67 == Shift-Jis (кодовая страница 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 или UCS-2
компиляция с Multi byte character set
*foo = 4a 61 70 20 74 65 78 74 3a 20 83 65 83 58 83 67 == Shift-Jis (кодовая страница 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 или UCS-2
компиляция с Not Set
* foo = 4a 61 70 20 74 65 78 74 3a 20 83 65 83 58 83 67 == Shift-Jis (кодовая страница 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 или UCS-2
вывод: Кодировка символов не оказывает никакого влияния на жестко закодированные строки. Хотя определение символов, как указано выше, похоже, использует кодовую страницу, определенную языковым стандартом, а wchar_t, похоже, использует UCS-2 или UTF-16.
использование закодированных строк в версиях W/A из API-интерфейсы Win32
Итак, используя следующий код:
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);
компиляция с Unicode
результат: оба файла создаются
компиляция с Multi byte character set
результат: оба файла создаются
компиляция с Not set
результат: оба файла создаются
вывод:
Оба A
и W
версия API ожидает ту же кодировку независимо от выбранного набора символов. Из этого, возможно, можно предположить, что все Character Set
опция делает это переключение между версией API. Так что A
версия всегда ожидает строки в кодировке текущей кодовой страницы и W
версия всегда ожидает UTF-16 или UCS-2.
открытие файлов с помощью W и Win32 APIs
Итак, используя следующий код:
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*.*Text*.TXT";
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*.*Text*.TXT";
ofnw.nFilterIndex =1;
ofnw.lpstrFileTitle = NULL;
ofnw.nMaxFileTitle = 0 ;
ofnw.lpstrInitialDir=NULL ;
ofnw.Flags = OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST ;
GetOpenFileNameA(&ofna);
GetOpenFileNameW(&ofnw);
и выбрать либо:
- C:Tempテストテopenw.txt
- C:Tempテストテopenw.txt
выходы:
при компиляции с 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 (кодовая страница 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 или UCS-2
при компиляции с 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 (кодовая страница 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 или UCS-2
когда скомпилировано с 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 (кодовая страница 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 или UCS-2
вывод:
Опять же,Character Set
настройка не имеет отношения к поведение Win32 API. The A
версия всегда возвращает строку с кодировкой активной кодовой страницы и W
one всегда возвращает UTF-16 или UCS-2. Я прямо вижу, как это объяснил в этот великий ответ: https://stackoverflow.com/a/3299860/187100.
Окончательное Заключение
Ханс кажется правильным, когда он говорит, что определение на самом деле не имеет никакой магии, кроме изменения Win32 API для использования либо W
или A
. Поэтому я не вижу никакой разницы между Not Set
и Multi byte character set
.
2 ответов
нет, на самом деле это не так. Единственное, что происходит, это то, что макрос определяется, иначе он не оказывает магического влияния на компилятор. Это очень редкие на самом деле писать код, который использует #ifdef _MBCS
для проверки этого макроса.
вы почти всегда оставляете его до вспомогательной функции, чтобы сделать преобразование. Как WideCharToMultiByte (), OLE2A () или wctombs (). Которые являются функциями преобразования, которые всегда рассматривают многобайтовые кодировки, руководствуясь кодовая страница. _MBCS является исторической случайностью, актуальной только 25+ лет назад, когда многобайтовые кодировки еще не были распространены. Так же, как использование кодировки без Юникода, в наши дни также является историческим артефактом.
на ссылка установлено, что:
по определению, набор символов ASCII является подмножеством всех многобайтовые наборы символов. Во многих многобайтовых наборах символов каждый символ в диапазоне 0x00-0x7F идентичен символу, который имеет то же значение в наборе символов ASCII. Например, в обоих случаях Строки символов ASCII и MBCS, 1-байтовый нулевой символ ('\0') имеет значение 0x00 и указывает завершающий null характер.
как вы догадались, при включении _MBCS
в Visual Studio также поддерживает ASCII
один набор символов.
во втором ссылка, кажется, что поддерживается один набор символов, даже если мы включаем _MBCS
:
переносимость MBCS/Unicode: использование Tchar.файл заголовка h, вы можете построить однобайтовые, MBCS и Unicode приложения из тех же источников. В файле TCHAR.h определяет макросы с префиксом _tcs , какая карта к str, _mbs, или функции wcs, по мере необходимости. Для построения MBCS определите символ _MBCS. Чтобы создать Unicode, определите символ _UNICODE. По умолчанию, _MBCS является определено для приложений MFC. Дополнительные сведения см. В разделе Generic-Text Отображение в Tchar.h.