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

pinyin.c 與 Unicode 漢字編碼表對應原理解析:O(1) 取拼音首字母

     編輯:關於C

核心原理

Unicode 基本多文種平面 (BMP) 中,常用漢字編碼範圍 U+4E00 ~ U+9FA5(十進位 19968 ~ 40869),共 20902 字。將這 20902 字的拼音首字母按編碼順序存入一個 char 陣列,查詢時只需:

char first_letter(uint16_t ch) {
    int idx = ch - 0x4E00; // 19968
    if (idx >= 0 && idx < 20902) return table[idx];
    return 0; // 非漢字
}

時間複雜度 O(1),無哈希衝突、無二分搜尋,極致快速。

編碼對應表範例 (U+4E00 起)

U+4E00: 一  → 'y'
U+4E01: 丁  → 'd'
U+4E02: 丂  → 'k'
U+4E03: 七  → 'q'
U+4E04: 丄  → 's'
...
對應 table[0] = 'y', table[1] = 'd', table[2] = 'k'...

pinyin.c 關鍵程式碼

#define HANZI_START 19968      // 0x4E00
#define HANZI_COUNT 20902      // 0x9FA5 - 0x4E00 + 1

static char firstLetterArray[HANZI_COUNT] = 
    "ydkqsxnwzssxjbymgcczqpssqbycdscdqldylybssjgyqzjjfgcclzznwdwzjljpfyynnjjtmynzwzhflzppqhgccyynmjqyxxgd"
    "nnsnsjnjnsnnmlnrxyfsngnnnnqzggllyjlnyzssecykyyhqwjssggyxyqyjtwktjhychmnxjtlhjyqbyxdldwrrjnwysrldzjpc"
    "bzjjbrcfslnczstzfxxchtrqggddlyccssymmrjcyqzpwwjjyfcrwfdfzqpyddwyxkyjawjffxjbcftzyhhycyswccyxsclcxxwz"
    "cxnbgnnxbxlzsqsbsjpysazdhmdzbqbscwdzzyytzhbtsyyfzgntnxjywqnknphhlxgybfmjnbjhhgqtjcysxstkzglyckglysmz"
    "xyalmeldccxgzyrjxjzlnjzcqkcnnjwhjczccqljststbnhbtyxceqxkkwjyflzqlyhjxspsfxlmpbysxxxytccnylllsjxfhjxp"
    "jbtffyabyxbcczbzyclwlczggbtssmdtjcxpthyqtgjjxcjfzkjzjqnlzwlslhdzbwjncjzyzsqnycqynzcjjwybrtwpyftwexcs"
    /* ... 共 20902 字元 ... */;

char pinyinFirstLetter(unsigned short hanzi) {
    int index = hanzi - HANZI_START;
    if (index >= 0 && index < HANZI_COUNT)
        return firstLetterArray[index];
    return hanzi; // 非漢字回傳原碼
}

優缺點分析

優點缺點
查詢極快 O(1),無分支預測失誤佔用 20 KB 靜態記憶體 (嵌入式需評估)
程式碼極簡單,無執行時計算僅支援 BMP 範圍漢字,擴展區需另表
適合離線/嵌入式環境,無外部依賴多音字只能取首選讀音,需上下文消歧時無力

擴展建議

  • 多音字:改存 uint16_t 索引指向拼音表,或位元打包多讀音。
  • 擴展區:建立第二張表對應 U+20000~U+2FA1F,查詢先判斷範圍。
  • 壓縮:對首字母做 Run-Length Encoding (RLE) 或 Huffman,解碼時稍費 CPU 但省空間。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved