美文网首页iOS项目实用
iOS 文字转拼音方法的比较

iOS 文字转拼音方法的比较

作者: 一粒咸瓜子 | 来源:发表于2019-05-29 10:24 被阅读0次

基于《iOS开发中如何更快的实现汉字转拼音》

方法列举

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,同时不要忘记清除缓存时的处理。

相关文章

网友评论

    本文标题:iOS 文字转拼音方法的比较

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