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

2018-05-09  本文已影响0人  527267线的iOS工程师

因为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;
    
}
上一篇下一篇

猜你喜欢

热点阅读