iOS汉字转拼音
微信通讯录列表右侧的字母表控件, 想必大家每天都在使用, 其功能着实感觉强大, 查找好友只需要轻轻一划, 就可以根据姓氏首字母找到好友, 而无需从很长的列表划好几下, 更没必要从标签查找了. 这种便捷想必大家每天都在收益.
那么问题来了, 字母和姓氏怎么一一对应的呢?系统是老外写的,不可能像新华字典那样对每个汉字都有个目录吧?
终于功夫不负有心人, 查找官方文档, 在
CoreFoundation
框架的CFString.h
文件中找到了CFStringTransform
函数,其实这个函数就可以实现汉字转拼音的功能.
在此我分别封装了一个类方法和一个NSString
的类别方法:
1. 类方法:
iOSChineseToPinyin.h
#import <Foundation/Foundation.h>
@interface iOSChineseToPinyin : NSObject
+ (NSString *)getPinyin:(NSString *)chinese;
@end
iOSChineseToPinyin.m
#import "iOSChineseToPinyin.h"
@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
2. 类别方法:
NSString+Pinyin.h
#import <Foundation/Foundation.h>
@interface NSString (Pinyin)
- (NSString *)getPinyin;
@end
NSString+Pinyin.m
#import "NSString+Pinyin.h"
@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
封装的好处就是方便调用嘛~
下面给出一个小小的Example:
#import <Foundation/Foundation.h>
#import "iOSChineseToPinyin.h"
#import "NSString+Pinyin.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSString *chinese = @"好好学习,天天向上!";
// 类方法调用
NSString *pinyin = [iOSChineseToPinyin getPinyin:chinese];
NSLog(@"Method: %@",pinyin);
// 类别调用
NSLog(@"Category: %@", [chinese getPinyin]);
}
return 0;
}
Result:
代码直接拿去吧!
如果代码中有什么 bug 或者需要改进的地方, 还望海涵, 同时欢迎在下方留言~
不要吝啬您那宝贵的♥︎&★就好, 您的支持是我分享的动力~😝