获取汉字的首字母

为了实现基于 首字母的查询,研究了下 汉字获取首字母的算法,实现的代码如下:

 

///<定义 bool

typedef char bool;

#define  TRUE 1

#define  FALSE 1

static bool  In(um_wchar   start,   um_wchar   end,   um_wchar   code)  
{  
    if (code   >=   start   &&   code   <=   end)    
    {  
        return   TRUE;  
    }  
    return   FALSE;  


static  char   convertToAlpha(wchar   n)  
{  
    if   (In(0xB0A1,0xB0C4,n))   return   'A';  
    if   (In(0XB0C5,0XB2C0,n))   return   'B';  
    if   (In(0xB2C1,0xB4ED,n))   return   'C';  
    if   (In(0xB4EE,0xB6E9,n))   return   'D';  
    if   (In(0xB6EA,0xB7A1,n))   return   'E';  
    if   (In(0xB7A2,0xB8c0,n))   return   'F';  
    if   (In(0xB8C1,0xB9FD,n))   return   'G';  
    if   (In(0xB9FE,0xBBF6,n))   return   'H';  
    if   (In(0xBBF7,0xBFA5,n))   return   'J';  
    if   (In(0xBFA6,0xC0AB,n))   return   'K';  
    if   (In(0xC0AC,0xC2E7,n))   return   'L';  
    if   (In(0xC2E8,0xC4C2,n))   return   'M';  
    if   (In(0xC4C3,0xC5B5,n))   return   'N';  
    if   (In(0xC5B6,0xC5BD,n))   return   'O';  
    if   (In(0xC5BE,0xC6D9,n))   return   'P';  
    if   (In(0xC6DA,0xC8BA,n))   return   'Q';  
    if   (In(0xC8BB,0xC8F5,n))   return   'R';  
    if   (In(0xC8F6,0xCBF0,n))   return   'S';  
    if   (In(0xCBFA,0xCDD9,n))   return   'T';  
    if   (In(0xCDDA,0xCEF3,n))   return   'W';  
    if   (In(0xCEF4,0xD188,n))   return   'X';  
    if   (In(0xD1B9,0xD4D0,n))   return   'Y';  
    if   (In(0xD4D1,0xD7F9,n))   return   'Z';  
    return   '/0';  
}  

char*  GetAlpha(char* gbkStr)
{

    char   chr[3];  
    wchar   wchr   =   0;
    char*    alphaStr = UM_NULL;
    int        len;
    int         nIndex = 0; //首字母数组的长度索引
   int         i;

    if (!gbkStr)
    {
        return NULL;
    }
    len = strlen(gbkStr) + 1;
    if (len > 0)
    {
        alphaStr = malloc(len);
        if (alphaStr)
        {
            memset(alphaStr, 0x00, len);
        }

    }

    for (i = 0; i< len - 1;)
    {
        char tmpchar = '/0';

        if (gbkStr[i] > 0 && gbkStr[i] < 128) //非汉字
        {
            if (gbkStr[i] >= 'a' && gbkStr[i] <= 'z')
            {
                tmpchar = (char)(gbkStr[i] - 'a' + 'A');
                alphaStr[nIndex++] = tmpchar;
            }
            if (gbkStr[i] >= 'A' && gbkStr[i] <= 'Z')
            {
                tmpchar = gbkStr[i];
                alphaStr[nIndex++] = tmpchar;
            }
            ///<数字
            if (gbkStr[i] >= '0' && gbkStr[i] <= '9')
            {
                tmpchar = gbkStr[i];
                alphaStr[nIndex++] = tmpchar;
            }
            i++;
        }
        else //汉字
        {
            memset(chr,   0x00,   sizeof(char));  
            chr[0]   =   gbkStr[i++];  
            chr[1]   =   gbkStr[i++];  
            chr[2]   =   '/0';  

            wchr   =   0;  
            wchr   =   (chr[0]   &   0xff)   <<   8;  
            wchr   |=  (chr[1]   &   0xff);  

            tmpchar = convertToAlpha(wchar);
            if(tmpchar != '/0')
            {
                alphaStr[nIndex++] = tmpchar;
            }
        }
    }
    return alphaStr;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值