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

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, _ 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下载地址

你可能感兴趣的:(iOS)