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

C 語言寬字符與 Unicode 處理完全指南

     編輯:關於C語言

C 語言寬字符集操作函數與 Unicode 實戰

隨著國際化需求增長,C 語言透過 wchar_t 與寬字符函數族支援 Unicode。本文整理標準庫對應關係、多位元組/寬字符轉換、以及 ANSI/Unicode 雙模式開發要點。

寬字符函數對照表

分類寬字符函數對應 ANSI 函數功能
字符分類iswalnumisalnum字母數字判斷
iswalphaisalpha字母判斷
iswcntrliscntrl控制字符判斷
iswdigitisdigit數字判斷
iswgraphisgraph可見字符判斷
iswlowerislower小寫判斷
iswprintisprint可列印判斷
iswpunctispunct標點判斷
iswspaceisspace空白判斷
iswupperisupper大寫判斷
iswxdigitisxdigit十六進制數字判斷
大小寫轉換towlowertolower轉小寫
towuppertoupper轉大寫
字符串比較/排序wcscollstrcoll按當前 locale 比較
wcsftimestrftime格式化時間 (寬字符輸出)
wcsftime-寬字符版時間格式化
格式化 I/Ofwprintffprintf檔案格式化寫入
fwscanffscanf檔案格式化讀取
wprintfprintf標準輸出格式化寫入
wscanfscanf標準輸入格式化讀取
swprintfsprintf字符串格式化寫入
swscanfsscanf字符串格式化讀取
vfwprintfvfprintfva_list 版檔案輸出
數值轉換wcstodstrtod字符串轉 double
wcstolstrtol字符串轉 long
wcstoulstrtoul字符串轉 unsigned long
多位元組/寬字符轉換mblen-多位元組字符長度
mbstowcs-多位元組串轉寬字符串
mbtowc/btowc-單字符轉寬字符
wcstombs-寬字符串轉多位元組串
wctomb/wctob-寬字符轉多位元組
檔案/流 I/Ofgetwcfgetc讀取寬字符
fgetwsfgets讀取寬字符串
fputwcfputc寫入寬字符
fputwsfputs寫入寬字符串
getwcgetc標準輸入讀寬字符
getwchargetchar標準輸入讀寬字符
putwcputc標準輸出寫寬字符
putwcharputchar標準輸出寫寬字符
ungetwcungetc回推寬字符到流
字符串操作wcscatstrcat字符串拼接
wcsncatstrncat指定長度拼接
wcschrstrchr查找字符首次出現
wcsrchrstrrchr反向查找字符
wcspbrkstrpbrk查找任一字符集首次出現
wcsstrstrstr查找子串首次出現
wcscspnstrcspn不含指定字符集的初始長度
wcsspnstrspn僅含指定字符集的初始長度
wcscpystrcpy字符串複製
wcsncpystrncpy指定長度複製
wcscmpstrcmp字符串比較
wcsncmpstrncmp指定長度比較
wcslenstrlen字符串長度
記憶體操作wmemcpymemcpy記憶體複製
wmemmovememmove記憶體移動
wmemcmpmemcmp記憶體比較
wmemchrmemchr記憶體查找字符
wmemsetmemset記憶體設置

多位元組與寬字符轉換核心函數


// 多位元組字符串 -> 寬字符串
size_t mbstowcs(wchar_t *pwcs, const char *s, size_t n);

// 寬字符串 -> 多位元組字符串
size_t wcstombs(char *s, const wchar_t *pwcs, size_t n);

// 單字符轉換 (受 locale 影響)
int mbtowc(wchar_t *pwc, const char *s, size_t n);
int wctomb(char *s, wchar_t wchar);

// 判斷多位元組字符長度
int mblen(const char *s, size_t n);

關鍵點:轉換行為由當前 LC_CTYPE locale 決定。UTF-8 locale 下可正確處理中文;"C" locale 下多位元組字符長度通常為 1,無法正確轉換非 ASCII 字符。

ANSI / Unicode 雙模式開發模式

Windows 平台透過宏切換:

  • 定義 UNICODE (Windows SDK) 與 _UNICODE (CRT) → 啟用寬字符版本
  • 未定義 → 使用 ANSI 版本 (單位元組/雙位元組混合,如 GBK)

通用類型映射:

宏定義UNICODE=1UNICODE=0
TCHARwchar_tchar
LPTSTRLPWSTRLPSTR
LPCTSTRLPCWSTRLPCSTR
字符串字面值L"text" / _T("text")"text"
字符串函數wcscpy, _tcscpystrcpy, _tcscpy

使用 _T() 或 TEXT() 宏包裹字面值,配合 _tcs* 通用函數,可實現單一代碼庫雙模式編譯。

編碼轉換實用建議

  1. 跨平台/網路傳輸:統一使用 UTF-8 (char*),避免 wchar_t 大小不一 (Windows 2 bytes, Linux 4 bytes) 導致的二進制不相容
  2. Windows API 呼叫:優先使用寬字符版 (以 W 結尾,如 CreateFileW),避免 ANSI 版隱含轉換效能損耗
  3. 檔案存儲:採用 UTF-8+BOM 或無 BOM UTF-8,讀寫時按需轉換
  4. ICU 庫:複雜 Unicode 處理 (正規化、排序、斷詞) 建議引入 ICU,而非自行實現

常見誤區

  • wchar_t 不是固定 2 字節:C 標準僅保證能容納基本字符集,實際大小由實現定義
  • setlocale(LC_ALL, "") 必須在多位元組函數調用前執行,否則行為未定義
  • UTF-8 是 Unicode 的一種編碼實現,非同義詞。Unicode 定義碼位;UTF-8/16/32 定義碼位到位元組序列的映射
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved