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: 一 → 'y' U+4E01: 丁 → 'd' U+4E02: 丂 → 'k' U+4E03: 七 → 'q' U+4E04: 丄 → 's' ... 對應 table[0] = 'y', table[1] = 'd', table[2] = 'k'...
#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 索引指向拼音表,或位元打包多讀音。