ASCII 僅 256 字元,無法涵蓋中日韓(CJK)等數萬字元。Unicode 採雙位元組(16-bit)編碼,統一碼表支援全球語言。VC++/MFC 開發國際化應用必須支援 Unicode。
_UNICODE 與 UNICODE。_UNICODE:C 執行期標頭檔;UNICODE:Windows SDK 標頭檔。stdafx.h 最前端定義:#define _UNICODE / #define UNICODE。| 通用類型 | ANSI (無定義) | Unicode (定義) | 說明 |
|---|---|---|---|
_TCHAR / TCHAR | char | wchar_t | 字元型別 |
_T() / _TEXT() / TEXT() | 無作用 | 加 L 前綴 | 字串常數轉換 |
LPTSTR | char* | wchar_t* | 可修改字串指標 |
LPCTSTR | const char* | const wchar_t* | 常數字串指標 |
註:TCHAR 等為 Microsoft 專有,非 ANSI 標準。
// ANSI 版
Create(NULL, "Hello World!", WS_OVERLAPPEDWINDOW, CRect(0,0,200,200));
cs->Create("hello world", WS_CHILD|WS_VISIBLE|SS_CENTER, CRect(50,80,150,150), this);
// Unicode 版:所有字串常數包裹 TEXT()
Create(NULL, TEXT("Hello World!"), WS_OVERLAPPEDWINDOW, CRect(0,0,200,200));
cs->Create(TEXT("hello world"), WS_CHILD|WS_VISIBLE|SS_CENTER, CRect(50,80,150,150), this);
// ANSI 版
char vol[MAX_PATH];
cin >> vol;
SetVolumeLabel("c:\\", vol);
// Unicode 版
TCHAR vol[MAX_PATH];
cin >> vol; // 需配合 wcin 或轉換
SetVolumeLabel(TEXT("c:\\"), vol);
char → TCHAR;char* → LPTSTR;const char* → LPCTSTR。TEXT("...")。strcpy → _tcscpy,strlen → _tcslen,strcmp → _tcscmp 等(對應 tchar.h)。cout/cin → wcout/wcin,或使用 CString 統一處理。
CString str = "測試"; // 內部自動依專案設定儲存為 ANSI/Unicode
BSTR bstr = str.AllocSysString(); // 轉 COM BSTR (Unicode)
::SysFreeString(bstr);
CString 封裝轉換細節,是 MFC 專案處理字串的首選。
_UNICODE 時,相同程式碼編譯為 ANSI 版本,外觀行為一致。_UNICODE 自動選擇 A(ANSI)或 W(Wide)版本 API(如 SetWindowTextA/W)。Jeffrey Richter《Windows 核心程式設計》(中譯本)專章詳細論述 Unicode 實作細節與最佳實務。
啟用 Unicode 只需:定義雙巨集、使用通用類型、包裹字串常數、改用通用字串函式。VC++ 提供透明遷移路徑,讓單一原始碼支援 ANSI 與 Unicode 雙模式編譯,是國際化軟體開發的基石技能。