首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

Visual C++ Unicode 程式設計入門完整指南

     編輯:關於VC++

為什麼需要 Unicode

ASCII 僅 256 字元,無法涵蓋中日韓(CJK)等數萬字元。Unicode 採雙位元組(16-bit)編碼,統一碼表支援全球語言。VC++/MFC 開發國際化應用必須支援 Unicode。

VC++ 專案啟用 Unicode

  1. 專案屬性 → C/C++ → 預處理器定義,加入 _UNICODE 與 UNICODE。
  2. _UNICODE:C 執行期標頭檔;UNICODE:Windows SDK 標頭檔。
  3. 或在 stdafx.h 最前端定義:#define _UNICODE / #define UNICODE。

通用資料類型與巨集

通用類型ANSI (無定義)Unicode (定義)說明
_TCHAR / TCHARcharwchar_t字元型別
_T() / _TEXT() / TEXT()無作用加 L 前綴字串常數轉換
LPTSTRchar*wchar_t*可修改字串指標
LPCTSTRconst char*const wchar_t*常數字串指標

註:TCHAR 等為 Microsoft 專有,非 ANSI 標準。

程式碼遷移實例

MFC Hello World


// 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);

Win32 API SetVolumeLabel


// ANSI 版
char vol[MAX_PATH];
cin >> vol;
SetVolumeLabel("c:\\", vol);

// Unicode 版
TCHAR vol[MAX_PATH];
cin >> vol; // 需配合 wcin 或轉換
SetVolumeLabel(TEXT("c:\\"), vol);

關鍵程式設計習慣

  1. 所有 char → TCHAR;char* → LPTSTR;const char* → LPCTSTR。
  2. 所有雙引號字串常數 → TEXT("...")。
  3. 字串操作函式:strcpy → _tcscpy,strlen → _tcslen,strcmp → _tcscmp 等(對應 tchar.h)。
  4. 標準 I/O:cout/cin → wcout/wcin,或使用 CString 統一處理。

MFC CString 內建 Unicode 支援


CString str = "測試"; // 內部自動依專案設定儲存為 ANSI/Unicode
BSTR bstr = str.AllocSysString(); // 轉 COM BSTR (Unicode)
::SysFreeString(bstr);

CString 封裝轉換細節,是 MFC 專案處理字串的首選。

編譯與執行期注意事項

  • 必須安裝 MFC Unicode 程式庫(VC++ 自訂安裝選項)。
  • 未定義 _UNICODE 時,相同程式碼編譯為 ANSI 版本,外觀行為一致。
  • 混用 ANSI/Unicode API 會導致連結錯誤或執行期亂碼,編譯器依 _UNICODE 自動選擇 A(ANSI)或 W(Wide)版本 API(如 SetWindowTextA/W)。

推薦參考資源

Jeffrey Richter《Windows 核心程式設計》(中譯本)專章詳細論述 Unicode 實作細節與最佳實務。

總結

啟用 Unicode 只需:定義雙巨集、使用通用類型、包裹字串常數、改用通用字串函式。VC++ 提供透明遷移路徑,讓單一原始碼支援 ANSI 與 Unicode 雙模式編譯,是國際化軟體開發的基石技能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved