微信通讯录列表右侧字母表控件, 着实感觉功能强大, 查找好友只要轻轻一划, 就可以找到好友, 而无需从很长的列表划好几下, 更没必要从标签查找了.
那么问题来了, 字母和姓氏怎么对应的呢? 系统是老外写的, 不可能像新华字典一样有个目录吧? 查找官方文档, 在CoreFoundation框架中找到了CString这个文件中的
CFStringTransform函数, 其实就这个函数就可以实现汉字转拼音的功能.
在此我分别封装了一个类方法和一个NSString的类别方法:
类方法:
iOSChineseToPinyin.h
@interface iOSChineseToPinyin : NSObject
+ (NSString *)getPinyin:(NSString *)chinese;
@end</span>
iOSChineseToPinyin.m
@implementation iOSChineseToPinyin
+ (NSString *)getPinyin:(NSString *)chinese {
NSMutableString *mutableString = [NSMutableString stringWithString:chinese];
// Boolean CFStringTransform(CFMutableStringRef string, CFRange *range, CFStringRef transform, Boolean reverse);
CFStringTransform((CFMutableStringRef)mutableString, NULL, kCFStringTransformToLatin, false); // 汉字转成拼音(不知道为什么英文是拉丁语的意思)
CFStringTransform((CFMutableStringRef)mutableString, NULL, kCFStringTransformStripDiacritics, false); // 去掉音调
return mutableString;
}
@end</span>
NSString类别:
NSString+Pinyin.h
@interface NSString (Pinyin)
- (NSString *)getPinyin;
@end</span>
NSString+Pinyin.m
@implementation NSString (Pinyin)
- (NSString *)getPinyin {
NSMutableString *mutableString = [NSMutableString stringWithString:self];
// Boolean CFStringTransform(CFMutableStringRef string, CFRange *range, CFStringRef transform, Boolean reverse);
CFStringTransform((CFMutableStringRef)mutableString, NULL, kCFStringTransformToLatin, false); // 汉字转成拼音(不知道为什么英文是拉丁语的意思)
CFStringTransform((CFMutableStringRef)mutableString, NULL, kCFStringTransformStripDiacritics, false); // 去掉音调
return mutableString;
}
@end</span>
封装的好处就是方便调用嘛~
类方法调用:
#import "iOSChineseToPinyin.h"
NSString *chinese = @"好好学习,天天向上";
NSString *pinyin = [iOSChineseToPinyin getPinyin:chinese];
NSLog(@"Method: %@",pinyin);</span>
类别调用:
#import "NSString+Pinyin.h"
NSString *chinese = @"好好学习,天天向上";
NSLog(@"Category: %@", [chinese getPinyin]);</span>