方法列举
A. 最终版 项目中直接采用了这种方法,原因:处理速度快。
- (NSString *)transformToPinyin {
NSMutableString *mutableString = [NSMutableString stringWithString:self];
CFStringTransform((CFMutableStringRef)mutableString, NULL, kCFStringTransformToLatin, false);
mutableString = (NSMutableString *)[mutableString stringByFoldingWithOptions:NSDiacriticInsensitiveSearch locale:[NSLocale currentLocale]];
return [mutableString stringByReplacingOccurrencesOfString:@"'" withString:@""];
}
B. PinYin4Objc 项目中未采用此方法,因为该库已不进行维护
C. 网友推荐的方法
- (NSString *)transformToPinyin {
NSMutableString *mutableString = [NSMutableString stringWithString:self];
CFStringTransform((CFMutableStringRef)mutableString, NULL, kCFStringTransformToLatin, false);
CFStringTransform((CFMutableStringRef)mutableString, NULL, kCFStringTransformStripDiacritics, false);
return mutableString;
}
D. 正则表达式优先过滤英文数字特殊字符等
- (NSString *)transformToPinyin {
NSMutableString *mutableString = [NSMutableString stringWithString:self];
BOOL isNeedTransform = ![self isAllEngNumAndSpecialSign];
if (isNeedTransform) {
CFStringTransform((CFMutableStringRef)mutableString, NULL, kCFStringTransformToLatin, false);
CFStringTransform((CFMutableStringRef)mutableString, NULL, kCFStringTransformStripDiacritics, false);
}
return mutableString;
}
- (BOOL)isAllEngNumAndSpecialSign {
NSString *regularString = @"^[A-Za-z0-9\\p{Z}\\p{P}]+$";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regularString];
return [predicate evaluateWithObject:self];
}
E. 参考NSHipster
- (NSString *)transformToPinyin {
NSMutableString *mutableString = [NSMutableString stringWithString:self];
BOOL isNeedTransform = ![self isAllEngNumAndSpecialSign];
if (isNeedTransform) {
CFStringTransform((CFMutableStringRef)mutableString, NULL, kCFStringTransformToLatin, false);
CFStringTransform((CFMutableStringRef)mutableString, NULL, kCFStringTransformStripCombiningMarks, false);
}
return mutableString;
}
- (BOOL)isAllEngNumAndSpecialSign {
NSString *regularString = @"^[A-Za-z0-9\\p{Z}\\p{P}]+$";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regularString];
return [predicate evaluateWithObject:self];
}
测试demo:CompareTransformDemo
-[ViewController pinyin4ObjC]: 0.185478
-[ViewController 最终版]: 0.602104
-[ViewController 网友推荐]: 12.419527
-[ViewController 正则表达式优先过滤英文数字特殊字符等]: 13.215513
-[ViewController 参考NSHipster]: 7.774923
时间成本:PinYin4Objc < 最终版 << 其他方法
后续优化
多音字处理
目前暂无好的办法,可以手动列举进行处理,类似:
+ (NSString *)transformMandarinToLatin:(NSString *)hanzi { /* 部分多音字处理 */
NSString *pinyin = @"";
if ([hanzi compare:@"长"] == NSOrderedSame) {
pinyin = @"chang";
} else if ([hanzi compare:@"沈"] == NSOrderedSame) {
pinyin = @"shen";
} else if ([hanzi compare:@"厦"] == NSOrderedSame) {
pinyin = @"xia";
} else if ([hanzi compare:@"地"] == NSOrderedSame) {
pinyin = @"di";
} else if ([hanzi compare:@"重"] == NSOrderedSame) {
pinyin = @"chong";
} else if ([hanzi compare:@"行"] == NSOrderedSame) {
pinyin = @"xing";
}
return pinyin;
}
操作缓存
如果需要频繁调用汉字转拼音的方法(例如项目需求是通讯录+索引,每次处理顾客数据时都需要用到汉字转拼音的方法)
,可以考虑加上缓存,推荐使用 YYCache。
思路:将处理过的项存入 cache 中,每次启动时将数据从 diskCache 放入 memoryCache,同时不要忘记清除缓存时的处理。
网友评论