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

Windows API LCMapString 完整參考:字串轉換與排序鍵生成

     編輯:關於C++

函數用途

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
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved