現代 C++ 開發中,並非「一般都用 wchar_t」。選型取決於專案需求、目標平台、第三方庫支援及編碼策略。char 配合 UTF-8 是當前跨平台開發的主流選擇;wchar_t 主用於 Windows API 互操作或特定舊系統維護。
| 維度 | char (窄字元) | wchar_t (寬字元) |
|---|---|---|
| 大小 | 固定 1 byte | 實作定義:Windows 2 bytes (UTF-16),Linux/macOS 4 bytes (UTF-32) |
| 編碼 | 通常配合 UTF-8 (多位元組) | Windows 為 UTF-16,Unix-like 為 UTF-32 |
| 標準庫 | std::string, std::cout | std::wstring, std::wcout |
| 跨平台 | 極佳 (UTF-8 無處不在) | 差 (大小、字節序不一致) |
| Win32 API | 需呼叫 MultiByteToWideChar 轉換 | 原生支援 (TCHAR 映射) |
早期 C/C++ 以 char 處理 ASCII,中文環境下被迫使用 GBK/Big5 等多位元組編碼 (MBCS),導致「一個漢字佔兩個 char」的邏輯混亂,且無法統一處理多語言。Unicode 推出後,Windows 採用 UTF-16 (對應 wchar_t),一度形成「寬字元等同 Unicode」的誤解。實際上 Unicode 是字符集,UTF-8/16/32 才是編碼實現。
char + UTF-8 (std::string),內部處理可轉為 UTF-32 (char32_t/std::u32string) 便於逐字元操作。TCHAR/wchar_t 直接呼叫系統 API,邊界處做 UTF-8 ⇄ UTF-16 轉換。char8_t (UTF-8)、char16_t (UTF-16)、char32_t (UTF-32) 明確語義,避免 wchar_t 可移植性陷阱。#include <string>
#include <iostream>
// C++20: #include <charconv> // 標準轉碼支援
int main() {
std::string utf8 = u8"Hello 世界 🌍"; // 原始碼儲存為 UTF-8
std::cout << utf8 << '\n'; // 終端機需支援 UTF-8
// 若需呼叫 Win32 API:
// int len = MultiByteToWideChar(CP_UTF8, 0, utf8.c_str(), -1, nullptr, 0);
// std::wstring utf16(len, 0);
// MultiByteToWideChar(CP_UTF8, 0, utf8.c_str(), -1, &utf16[0], len);
}
「不用 char 改用 wchar_t」是過時經驗。採用 UTF-8 作為內部/外部統一編碼,僅在平台邊界做最薄轉換層,才是現代 C++ 專案的穩健架構。