函數用途
LCMapString 依指定地區設定,執行字串轉換 (大小寫、全半形、平假名/片假名、簡繁體互轉等) 或生成排序鍵。
函數原型
int LCMapString(
LCID Locale, // 地區識別碼
DWORD dwMapFlags, // 轉換/排序旗標
LPCTSTR lpSrcStr, // 來源字串
int cchSrc, // 來源字元數 (含 NULL 可為負值)
LPTSTR lpDestStr, // 目的緩衝區
int cchDest // 目的緩衝區大小 (字元數或位元組數)
);
核心旗標 dwMapFlags
| 旗標 | 說明 |
LCMAP_LOWERCASE | 轉小寫 |
LCMAP_UPPERCASE | 轉大寫 |
LCMAP_HIRAGANA | 片假名 → 平假名 |
LCMAP_KATAKANA | 平假名 → 片假名 |
LCMAP_HALFWIDTH | 全形 → 半形 |
LCMAP_FULLWIDTH | 半形 → 全形 |
LCMAP_SIMPLIFIED_CHINESE | 繁體 → 簡體 (NT 4.0+) |
LCMAP_TRADITIONAL_CHINESE | 簡體 → 繁體 (NT 4.0+) |
LCMAP_SORTKEY | 生成排序鍵 (與其他 LCMAP_* 互斥,除 BYTEREV) |
LCMAP_BYTEREV | 位元組反轉 (NT/2000/XP) |
LCMAP_LINGUISTIC_CASING | 語言規則大小寫 (僅搭配 LOWER/UPPER) |
排序鍵專用旗標 (需搭配 LCMAP_SORTKEY)
| 旗標 | 效果 |
NORM_IGNORECASE | 忽略大小寫 |
NORM_IGNOREKANATYPE | 不區分平/片假名 |
NORM_IGNORENONSPACE | 忽略非間距字元 (日文重音) |
NORM_IGNORESYMBOLS | 忽略符號 |
NORM_IGNOREWIDTH | 不區分半/全形 |
SORT_STRINGSORT | 標點視同符號處理 |
互斥規則摘要
LOWERCASE ↔ UPPERCASE
HIRAGANA ↔ KATAKANA
HALFWIDTH ↔ FULLWIDTH
TRADITIONAL_CHINESE ↔ SIMPLIFIED_CHINESE
LOWER/UPPER 不可與 HIRAGANA/KATAKANA/HALF/FULL 合用
SORTKEY 與所有 LCMAP_* 互斥 (除 BYTEREV)
參數細節
lpSrcStr / cchSrc
cchSrc > 0:指定字元數 (含或不含 NULL 均可)
cchSrc < 0:來源為 NULL 結尾字串,函數自行計算長度
lpDestStr / cchDest
- 字串轉換模式:
cchDest 為字元數,需含 NULL 空間
- 排序鍵模式:
cchDest 為位元組數,需含結束 0x00 空間
cchDest == 0:回傳所需緩衝區大小,不寫入資料
排序鍵格式
[所有 Unicode 權重] 0x01 [所有重音權重] 0x01 [所有大小寫權重] 0x01 [所有特殊權重] 0x00
- 以位元組陣列儲存,非可顯示字串
- 比較排序鍵:逐位元組
memcmp/strcmp
- 忽略旗標導致某權重缺失時,分隔符
0x01 與終結符 0x00 仍保留
回傳值
- 成功且
cchDest > 0:寫入的字元/位元組數 (含 NULL)
- 成功且
cchDest == 0:所需緩衝區大小
- 失敗:0,呼叫
GetLastError() 取得錯誤碼 (ERROR_INSUFFICIENT_BUFFER, ERROR_INVALID_FLAGS, ERROR_INVALID_PARAMETER)
常見應用範例
1. 繁轉簡 (需正確 LCID)
LCID zhTW = MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL), SORT_DEFAULT);
LCID zhCN = MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_DEFAULT);
TCHAR src[] = _T("繁體中文測試");
TCHAR dst[100];
LCMapString(zhCN, LCMAP_SIMPLIFIED_CHINESE, src, -1, dst, 100);
// dst = "简体中文测试"
2. 大小寫轉換 (語言敏感)
// 土耳其語 I/ı 處理需加 LCMAP_LINGUISTIC_CASING
LCMapString(LOCALE_SYSTEM_DEFAULT, LCMAP_UPPERCASE | LCMAP_LINGUISTIC_CASING, src, -1, dst, 100);
3. 生成排序鍵供快速比較
BYTE sortKey[256];
int len = LCMapString(LOCALE_USER_DEFAULT, LCMAP_SORTKEY | NORM_IGNORECASE, src, -1, (LPTSTR)sortKey, 256);
// 之後用 memcmp(sortKey1, sortKey2, len) 即可比較排序
注意事項
- ANSI 版本依 LCID 預設代碼頁轉 Unicode 再處理,系統代碼頁缺字會變
?
LCMAP_HIRAGANA 若未加 LCMAP_FULLWIDTH,半形片假名不轉換
- 排序鍵可能為奇數位元組,
LCMAP_BYTEREV 僅反轉偶數位元組,最後一個奇數位元組不動
- 字串映射模式下
lpSrcStr == lpDestStr 僅允許 LOWER/UPPER 且未設 SORTKEY
系統需求
- Header:
Winnls.h (含 Windows.h)
- Library:
Kernel32.lib
- Unicode/ANSI 版本皆有
- Win95/98/Me 需 Microsoft Layer for Unicode