基本概念
char 永遠佔 1 字節,用於窄字符(ASCII/多字節編碼)。
wchar_t 為寬字符類型,通常佔 2 或 4 字節(視平台),用於 Unicode 字符。
wchar_t 非內置關鍵字,定義於 <stddef.h>(或 <wchar.h>)。
字面量與格式化
- 寬字符字面量前綴
L:L'A'、L"Hello"。
printf 輸出寬字符串用 %S(大寫),窄字符串用 %s。
- 寬字符單字符輸出可用
%lc 或 %C(MS 扩展)。
示例代碼
#include <stdio.h>
#include <stddef.h> // 或 <wchar.h>
int main(void) {
wchar_t wc = L'A';
wchar_t ws[] = L"C++Builder 2009";
printf("%lc\n", wc); // 輸出單個寬字符
printf("%S\n", ws); // 輸出寬字符串
return 0;
}
相關函數族
| 窄字符版 | 寬字符版 | 功能 |
strlen | wcslen | 字符串長度 |
strcpy | wcscpy | 字符串拷貝 |
strcmp | wcscmp | 字符串比較 |
printf | wprintf | 格式化輸出 |
scanf | wscanf | 格式化輸入 |
fopen | _wfopen | 文件操作 (Windows) |
多字節與寬字符轉換
// 多字節 -> 寬字符
size_t mbsrtowcs(wchar_t *dst, const char **src, size_t len, mbstate_t *ps);
// 寬字符 -> 多字節
size_t wcsrtombs(char *dst, const wchar_t **src, size_t len, mbstate_t *ps);
// Windows API 直接轉換
int MultiByteToWideChar(UINT CodePage, DWORD dwFlags, LPCCH lpMultiByteStr, int cbMultiByte, LPWSTR lpWideCharStr, int cchWideChar);
int WideCharToMultiByte(UINT CodePage, DWORD dwFlags, LPCWCH lpWideCharStr, int cchWideChar, LPCH lpMultiByteStr, int cbMultiByte, LPCCH lpDefaultChar, LPBOOL lpUsedDefaultChar);
注意事項
wchar_t 大小不固定:Windows 2 字節 (UTF-16),Linux 通常 4 字節 (UTF-32)。
- 跨平台代碼建議使用固定寬度類型
char16_t/char32_t (C11) 或 UTF-8 窄字符串 + ICU 庫。
- 標準輸入輸出流(stdin/stdout)默認窄字符,寬字符 I/O 需調用
setlocale 或使用 wprintf 族函數。