您的位置:首页 > 移动开发 > IOS开发

iOS获取汉字拼音首字母的方法

2016-07-13 15:44 447 查看

iOS获取汉字拼音首字母的方法

之前在项目中需要根据昵称的首字母进行排序,蹚了几个坑,今天记录一下。
其实iOS系统封装的就有获取汉字首字母的方法,但不推荐,想看最优解的同学直接略过:


var name = "中国";
let cfName:CFMutableString = CFStringCreateMutableCopy(nil, 0, name);
let success = CFStringTransform(cfName, nil, kCFStringTransformMandarinLatin, false);
if (success) {
print(cfName);
}

/// public func CFStringTransform(string: CFMutableString!, _ range: UnsafeMutablePointer<CFRange>, _ transform: CFString!, _ reverse: Bool) -> Bool
///    系统的翻译方法 range传nil  则翻译整个字符串,返回true证明翻译成功
/*         transform 的可选值,这里选kCFStringTransformMandarinLatin  汉字转拼音
public let kCFStringTransformStripCombiningMarks: CFString!
public let kCFStringTransformToLatin: CFString!
public let kCFStringTransformFullwidthHalfwidth: CFString!
public let kCFStringTransformLatinKatakana: CFString!
public let kCFStringTransformLatinHiragana: CFString!
public let kCFStringTransformHiraganaKatakana: CFString!
public let kCFStringTransformMandarinLatin: CFString!
public let kCFStringTransformLatinHangul: CFString!
public let kCFStringTransformLatinArabic: CFString!
public let kCFStringTransformLatinHebrew: CFString!
public let kCFStringTransformLatinThai: CFString!
public let kCFStringTransformLatinCyrillic: CFString!
public let kCFStringTransformLatinGreek: CFString!
public let kCFStringTransformToXMLHex: CFString!
public let kCFStringTransformToUnicodeName: CFString!
@available(iOS 2.0, *)
public let kCFStringTransformStripDiacritics: CFString!
*/


执行以上代码输出:

"zhōng guó\n"


发现这并不是我们想要的东西,因为有类似声调的东西,如果是“暗夜”,就会得出“àn yè\n”,我们不能把所有声调的都算进“a”这个分组里。所以还需要下面一步把声调去掉:


let state = CFStringTransform(cfName, nil, kCFStringTransformStripDiacritics, Bool(0));
if (state) {
print(cfName);
}

///kCFStringTransformStripDiacritics  去除音调


通过以上两步,我们拿到了汉字的拼音字母“zhong guo\n”。

但是当我把这个方法使用到项目中的时候,我发现在我进入我的好友列表时,慢的要死,刚开始一直还以为是网络的原因,可是排查排查排查,终于发现原来是这个方法捣的鬼,也就是说这个方式会有很严重的效率问题,具体到什么地步,就以“中国”这一个词为例,耗费了 0.2秒左右的时间!!!一个词0.2秒,动则几百条的通讯录或者好友列表,要花费的时间就太恐怖了。

没办法,这个方法只能舍弃,虽然写法上只用了两行,但效率上的问题实在是不能直视。

于是改用了另外一种写法,添加pinyin.c、pinyin.m到项目,然后就可以放肆的获取拼音首字母了,不会有任何的效率问题,使用方法:

NSString *hanyu = @"中国共产党万岁!";
for (int i = 0; i < [hanyu length]; i++)  {
printf("%c", pinyinFirstLetter([hanyu characterAtIndex:i]));
}


pinyin.c、pinyin.m下载地址
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息