ASCII 使用 1 Byte 編碼 (0x00-0xFF),僅支援英文與部分符號。各國制定自有編碼 (中文為 GB2312),利用擴展 ASCII (高位元為 1) 雙位元組表示漢字,但與擴展 ASCII 符號衝突,且各國編碼互不相容。
Unicode 採用 2 Bytes (0x0000-0xFFFF),容納 65,536 字符,為全球所有文字分配唯一碼位,徹底解決多語言共存問題。
編碼對照範例:
| 字符 | ANSI | Unicode |
|---|---|---|
| A | 41H | 0041H |
| N | 4EH | 004EH |
| 和 | CDBAH | 548CH |
typedef unsigned short wchar_t; // 定義於 wchar.h
wchar_t* str = L"Hello"; // 前綴 L,不可有空格
ANSI 函數以 \0 結尾,Unicode 以 \0\0 結尾。strlen(L"Hello") 會誤判為 1,必須使用 wcslen。
#ifdef _UNICODE
typedef wchar_t TCHAR;
#define _T(x) L##x
#else
typedef char TCHAR;
#define _T(x) x
#endif
常用對照表:
| 宏/型別 | _UNICODE 未定義 | _UNICODE 已定義 |
|---|---|---|
| TCHAR | char | wchar_t |
| _T("str") | "str" | L"str" |
| _tcslen | strlen | wcslen |
| _tcscpy | strcpy | wcscpy |
| _tcscmp | strcmp | wcscmp |
Win32 依 UNICODE (無底線) 宏切換:
#ifdef UNICODE
#define SetWindowText SetWindowTextW
#else
#define SetWindowText SetWindowTextA
#endif
實際不存在 SetWindowText(),僅有 SetWindowTextA/W。_UNICODE 用於 C Runtime,UNICODE 用於 Windows SDK,實務上同時定義兩者。
_MBCS,加入 _UNICODE, UNICODEwWinMainCRTStartupTCHAR, _T(), LPTSTR, LPCTSTRsizeof(buf)/sizeof(TCHAR),位元組數 = sizeof(buf)_tcs* (CRT) 或 lstr* (Win32)掌握 Unicode 程式設計是開發國際化軟體的基礎,VC6.0 僅需簡單設定即可支援。