美文网首页
获取文字首字母的方法OC和C混编

获取文字首字母的方法OC和C混编

作者: 527267线的iOS工程师 | 来源:发表于2018-05-09 23:22 被阅读0次

    因为iOS的原声方法的速度太慢

    + (NSString *)transform:(NSString *)chinese {
        NSMutableString *pinyin = [[NSMutableString alloc] init];
        for (int i = 0; i < chinese.length; i++) {
            NSString *hanzi = [chinese substringWithRange:NSMakeRange(i, 1)];
            NSMutableString *hanzipinyin = [hanzi mutableCopy];
            CFStringTransform((__bridge CFMutableStringRef)hanzipinyin, NULL, kCFStringTransformMandarinLatin, NO);
            CFStringTransform((__bridge CFMutableStringRef)hanzipinyin, NULL, kCFStringTransformStripCombiningMarks, NO);
            [pinyin appendString:[[hanzipinyin uppercaseString] substringWithRange:NSMakeRange(0, 1)]];
            
        }
        
        return [pinyin uppercaseString];
    }
    

    就是这个方法,经理就是它!!!就是他让项目卡了两秒!!!
    所以在老架构的帮助下用C和OC混编了一个获取文字首字母的方法

    typedef struct {
        char *name;
        unsigned short first;
        unsigned short last;
    }CNSpell;
    
    typedef CNSpell *PCNSpell;
    CNSpell CNSpells[] = {
        {"A", 0xB0A1, 0xB0C4},
        {"B", 0xB0C5, 0xB2C0},
        {"C", 0xB2C1, 0xB4ED},
        {"D", 0xB4EE, 0xB6E9},
        {"E", 0xB6EA, 0xB7A1},
        {"F", 0xB7A2, 0xB8C0},
        {"G", 0xB8C1, 0xB9FD},
        {"H", 0xB9FE, 0xBBF6},
        {"J", 0xBBF7, 0xBFA5},
        {"K", 0xBFA6, 0xC0AB},
        {"L", 0xC0AC, 0xC2E7},
        {"M", 0xC2E8, 0xC4C2},
        {"N", 0xC4C3, 0xC5B5},
        {"O", 0xC5B6, 0xC5BD},
        {"P", 0xC5BE, 0xC6D9},
        {"Q", 0xC6DA, 0xC8BA},
        {"R", 0xC8BB, 0xC8F5},
        {"S", 0xC8F6, 0xCBF0},
        {"T", 0xCBFA, 0xCDD9},
        {"W", 0xCDDA, 0xCEF3},
        {"X", 0xCEF4, 0xD188},
        {"Y", 0xD1B9, 0xD4D0},
        {"Z", 0xD4D1, 0xD7F9},
    };
    + (NSString *)transformWithchinese:(NSString *)chinese {
        NSMutableString *string = [[NSMutableString alloc] init];
        //用GBK
        unsigned char *p=(unsigned short *)[chinese cStringUsingEncoding:CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingDOSChineseSimplif)];
        unsigned short c;
        while(*p)
        {
            //先判断ASCII
            if(*p>127)
            {
                c=*p;
                p++;
                //计算编码
                c=(c<<8)|*p;
            }
            else{
                c=*p;
                
            }
            NSLog(@"%d-%x",c,c);
                //汉字
            if (c < 0xD7FA && c > 0xB0A0) {
                [string appendString:[self transfromZiMu:c]];
            }else if (c > 64 && c < 91){
                //字母开头
                [string appendString:[self transfromASCII:c]];
                
                
            }else if ((c < 123 && c > 96)){
                //字母开头
                [string appendString:[self transfromASCII:c]];
                
            }else if (c > 47 && c < 58){
                //数字开头
                [string appendString:[self transfromASCII:c]];
                
            }else{
                
            }
            p++;
        }
        
        return [string copy];
    }
    + (NSString *)transfromASCII:(unsigned short)c{
        NSLog(@"%d", c);
        char a = (int)c;
        NSString *string = [NSString stringWithFormat:@"%c", a];
        NSLog(@"%@", string);
        return string;
    }
    + (NSString *)transfromZiMu:(unsigned short)c{
        //c = 0xB150;
        int begin = 0;
        int end = 22;
        int mid = 11;
        NSString *firstChar = @"";
        int i = 0;
        while (i == 0 && begin <= end) {
            mid = (begin + end) / 2;
            NSLog(@"%d", mid);
            if ( c < CNSpells[mid].first) {
                
                end=mid;
                
            }else if (c > CNSpells[mid].last) {
                begin=mid;
                
            } else {
                i = 1;
                
                firstChar = [NSString stringWithFormat:@"%s", CNSpells[mid].name];
                return firstChar;
            }
            
        }
        return firstChar;
        
    }
    

    相关文章

      网友评论

          本文标题:获取文字首字母的方法OC和C混编

          本文链接:https://www.haomeiwen.com/subject/khlarftx.html