最近在做字符串转拼音的速度优化,现分享给大家,各位朋友有什么想法可以给我留言,谢谢!
第一阶段:git开源工具:PinYin4Objc
第二阶段:网友推荐方法
1 2 3 4 5 6 |
- (NSString *)transformToPinyin { NSMutableString *mutableString = [NSMutableString stringWithString:self]; CFStringTransform((CFMutableStringRef)mutableString, NULL, kCFStringTransformToLatin, false); CFStringTransform((CFMutableStringRef)mutableString, NULL, kCFStringTransformStripDiacritics, false); return mutableString; } |
第三阶段: 正则表达式优先过滤英文数字特殊字符等
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
- (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]; } |
第四阶段:参考http://nshipster.com/cfstringtransform/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
- (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]; } |
第五阶段:终极优化版
1 2 3 4 5 6 |
- (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:@""]; } |
Demo移步https://github.com/panghaijiao/PHJTransformPinyinDemo,感谢你的来访!
之前做过九宫格快速拨号的功能 我的做法是预处理-查表 把所有汉字对应的拼音映射预先导出到文件 然后app启动时读取文件形成一个汉字-拼音一对一的字典 需要的时候直接查表就ok了 同时可以对文件内进行多音字的剔除优化 让映射始终保持一对一
转化拼音的方法有很多!不同的方法效率相差很大,不过只要满足需求,什么方法都可以!
这个能够解决多音字的问题吗?
不如沈识别出chen
NSString *str = @”沈从文”;
NSLog(@”%@”, [str transformToPinyin]);
————————————————–
PHJTransformPinyinDemo[1723:111408] chen cong wen
还是没解决多音字问题
这个的确是,不知道系统是怎么多音字的
NSString *str = @”沈从文”;
NSLog(@”%@”, [str transformToPinyin]);
—————————————————————————-
PHJTransformPinyinDemo[1723:111408] chen cong wen
kCFStringTransformStripDiacritics和kCFStringTransformMandarinLatin可以一定程度上解决多音字的问题, 但是不是100%
你好!
1)拼音是可以用来书写汉语的。建议制做一个以词为单位的文字输入软件。可参考国家颁布的汉语拼音正词法。
2)汉字文转拼音文,最好也以词为单位,而不是以音节为单位。我在知乎上用拼音写了一些回答,可以去看一下。
3)如果能搞出这两种软件,a)对学汉语但学不会汉字的老外可能很有用,b)对4一5岁的孩子学写作有帮助。
同音字多,同音词不多,同音同调的词呼没有。所以要以词为单位。
你好!
Wo hen xihuan yong pinyin xie dongxi. Ruguo nimen nenggou sheji chu yi ge pinyinwen shuru ruanjian jiu hao le.
Zuihao shi yi zhong daiyou shengdiao fuhao de, lingwai yi zhong bu dai shengdiao fuhao, tigong gei dajia xuanyong.
[mutableString stringByReplacingOccurrencesOfString:@”‘” withString:@””]
你好,最近在使用的时候发现,这行代码的意义是什么呢?有什么特殊的汉字转换后会含有单引号吗?
经过测试,替换单引号前后的拼音是一样的(可能测试的数据量不够)
具体我也忘记了
你好!
[mutableString stringByReplacingOccurrencesOfString:@”‘” withString:@””]
你好,最近在使用的时候发现,这行代码的意义是什么呢?有什么特殊的汉字转换后会含有单引号吗?
经过测试,替换单引号前后的拼音是一样的(可能测试的数据量不够)
最快的还是pinyin4
可以比较一下