Unicode汉字编码表(一部分)
U+ 0 1 2 3 4 5 6 7 8 9 A B C D E F
-----------------------------------------------------
4e00 一 丁 七 万 丈 三 上 下 丌 不 与
4e10 丐 丑 专 且 丕 世 丘 丙 业 丛 东 丝 丞
4e20 丢 两 严 丧 丨 个 丫 丬 中
4e30 丰 串 临 丶 丸 丹 为 主 丼 丽 举 丿
4e40 乃 久 乇 么 义 之 乌 乍 乎 乏
4e50 乐 乒 乓 乔 乖 乘 乙 乜 九 乞 也
4e60 习 乡 书 乩
4e70 买 乱 乳 乾
4e80 了 予 争 事 二 亍 于 亏
---------------------------------------------------
pinyin.c(这里面存的是常用汉字拼音首字母)
// unicode 中汉字的范围[\u4e00 - \u9fa5]。。这里是一部分
#define HANZI_START 19968
#define HANZI_COUNT 20902
static char firstLetterArray[HANZI_COUNT] =
"ydkqsxnwzssxjbymgcczqpssqbycdscdqldylybssjgyqzjjfgcclzznwdwzjljpfyynnjjtmynzwzhflzppqhgccyynmjqyxxgd"
"nnsnsjnjnsnnmlnrxyfsngnnnnqzggllyjlnyzssecykyyhqwjssggyxyqyjtwktjhychmnxjtlhjyqbyxdldwrrjnwysrldzjpc"
"bzjjbrcfslnczstzfxxchtrqggddlyccssymmrjcyqzpwwjjyfcrwfdfzqpyddwyxkyjawjffxjbcftzyhhycyswccyxsclcxxwz"
"cxnbgnnxbxlzsqsbsjpysazdhmdzbqbscwdzzyytzhbtsyyfzgntnxjywqnknphhlxgybfmjnbjhhgqtjcysxstkzglyckglysmz"
"xyalmeldccxgzyrjxjzlnjzcqkcnnjwhjczccqljststbnhbtyxceqxkkwjyflzqlyhjxspsfxlmpbysxxxytccnylllsjxfhjxp"
"jbtffyabyxbcczbzyclwlczggbtssmdtjcxpthyqtgjjxcjfzkjzjqnlzwlslhdzbwjncjzyzsqnycqynzcjjwybrtwpyftwexcs"
。。。。。。
。。。。
char pinyinFirstLetter(unsigned short hanzi)
{
int index = hanzi - HANZI_START;
if (index >= 0 && index <= HANZI_COUNT)
{
return firstLetterArray[index];
}
else
{
return hanzi;
}
}
-------------------
这个函数主要基于一个巨大的c语言char数组,把unicode字符集中所有中文的拼音首字母都映射进去了。
pinyinFirstLetter基于这么一个简单的原理:我们知道,在Objective C语言中,字符串是以unicode进行编码的。在unicode字符集中,汉字的编码范围为4E00 到 9FA5 之间(即从第19968开始的20902个字符是中文简体字符)。我们把这些字符的拼音首字母按照顺序都存放在一个char数组中。当我们查找一个汉字的拼音首字母时,只需把这个汉字的unicode码(即char强制转换为int)减去19968,然后用这个数字作为索引去找char数组中存放的字母即可。
----------------------------------------- 4e00对应的就是19968/一。。。。4e01 对应的就是19969/丁。。。4e02对应的就是19970/ 。。。。。类推。。。。