Я заметил, что в компиляторе Visual Studio есть два флага компилятора (для C ++), называемые MBCS и UNICODE.В чем разница между ними?
Многие функции в API Windows доступны в двух версиях: одна, которая принимает параметры char
(в кодовой странице, зависящей от локали), и одна, которая принимает wchar_t
параметры (в 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);
Каждая из этих пар функций также имеет макрос без суффикса, который зависит от того, определен макрос UNICODE
.
#ifdef UNICODE
#define MessageBox MessageBoxW
#else
#define MessageBox MessageBoxA
#endif
Чтобы сделать эту работу, тип TCHAR
определен, чтобы абстрагировать тип символов, используемый функциями API.
#ifdef UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif
Это, однако, было плохой идеей ,Вы всегда должны явно указывать тип символа.
Чего я не понимаю, так это то, как UTF-8 концептуально отличается от кодировки MBCS?
MBCS означает "multi-байтный набор символов ".Для ограниченного числа, кажется, что UTF-8 подойдет.
Но в Windows «MBCS» относится только к кодировкам символов, которые могут использоваться с версиями «A» функций API Windows.Это включает кодовые страницы 932 (Shift_JIS), 936 (GBK), 949 (KS_C_5601-1987) и 950 (Big5), но НЕ UTF-8.
Для использования UTF-8Вы должны преобразовать строку в UTF-16, используя MultiByteToWideChar
, вызвать версию функции "W" и вызвать WideCharToMultiByte
на выходе.По сути, это именно то, что на самом деле выполняют функции «А», что заставляет меня задуматься , почему Windows не просто поддерживает UTF-8 .
Эта неспособность поддерживать самый распространенный символкодировка делает «А» версию Windows API бесполезной.Поэтому вы должны всегда использовать функции "W" .
Unicode - это 16-битная кодировка символов
Это сводит на нет все, что я читал о Unicode.
MSDN неверен.Unicode - это 21-битный набор кодированных символов, который имеет несколько кодировок, наиболее распространенными из которых являются UTF-8, UTF-16 и UTF-32.(Существуют и другие кодировки Unicode, такие как GB18030, UTF-7 и UTF-EBCDIC.)
Всякий раз, когда Microsoft ссылается на «Unicode», они действительно означают UTF-16 (или UCS-2).Это по историческим причинам.Windows NT была одним из первых пользователей Юникода, когда 16 бит считалось достаточным для всех, а UTF-8 использовался только в Плане 9. Так что UCS-2 был Юникод.