获取文字首字母的方法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;
}