原文http://www.olinone.com/?p=131
最近在做字符串轉拼音的速度優化,現分享給大家,各位朋友有什麼想法可以給我留言,謝謝!
第一階段: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;
}
|
Demo移步https://github.com/panghaijiao/PHJTransformPinyinDemo,喜歡請點贊,感謝你的來訪!