iOS 将中文转成拼音,并拼接

主要使用CFStringTransform方法:

  • Object-C : Boolean CFStringTransform(CFMutableStringRef string, CFRange *range, CFStringRef transform, Boolean reverse);

  • Swift : public func CFStringTransform(_ string: CFMutableString!, _ range: UnsafeMutablePointer!, _ transform: CFString!, _ reverse: Bool) -> Bool

其中string参数是要被转换的中文字符串,需要将它转化成mutable的,该方法将它最终转成中文的拼音字符串,系统会将每个汉字的拼音用空格分隔开,可将空格替换将其拼接在一起。range是要转换的范围,同时输出转换后改变的范围,如果为nil,代表全部转换,也可传入UnsafeMutablePointer(bitPattern: 0)。transform则指定要进行什么样的转换,这里可以指定多种语言的拼写转换。reverse指定该转换是否必须是可逆向转换的。

transform 参数值 说明
kCFStringTransformStripCombiningMarks 删除重音符号
kCFStringTransformToLatin 中文的拉丁字母
kCFStringTransformFullwidthHalfwidth 全角半宽
kCFStringTransformLatinKatakana 片假名拉丁字母
kCFStringTransformLatinHiragana 平假名拉丁字母
kCFStringTransformHiraganaKatakana 平假名片假名
kCFStringTransformMandarinLatin 普通话拉丁字母
kCFStringTransformLatinHangul 韩文的拉丁字母
kCFStringTransformLatinArabic 阿拉伯语拉丁字母
kCFStringTransformLatinHebrew 希伯来语拉丁字母
kCFStringTransformLatinThai 泰国拉丁字母
kCFStringTransformLatinCyrillic 西里尔拉丁字母
kCFStringTransformLatinGreek 希腊拉丁字母
kCFStringTransformToXMLHex 转换为XML十六进制字符
kCFStringTransformToUnicodeName 转换为Unicode的名称
kCFStringTransformStripDiacritics 转换成不带音标的符号
Object-C
- (NSString *)pinYinWithString:(NSString *)chinese{
    NSString  * pinYinStr = [NSString string];
    if (chinese.length){
        NSMutableString * pinYin = [[NSMutableString alloc]initWithString:chinese];
    
        //先转换为带声调的拼音
        if (CFStringTransform((__bridge CFMutableStringRef)pinYin, 0, kCFStringTransformMandarinLatin, NO)) {
            NSLog(@"pinyin: %@", pinYin);
        }
    
        //再转换为不带声调的拼音
        if (CFStringTransform((__bridge CFMutableStringRef)pinYin, 0, kCFStringTransformStripDiacritics, NO)) {
            NSLog(@"pinyin: %@", pinYin);
        
            //再去除空格,将拼音连在一起
            pinYinStr = [NSString stringWithString:pinYin];
        
            // 去除掉首尾的空白字符和换行字符
            pinYinStr = [pinYinStr stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

            // 去除掉其它位置的空白字符和换行字符
            pinYinStr = [pinYinStr stringByReplacingOccurrencesOfString:@"\r" withString:@""];
            pinYinStr = [pinYinStr stringByReplacingOccurrencesOfString:@"\n" withString:@""];
            pinYinStr = [pinYinStr stringByReplacingOccurrencesOfString:@" " withString:@""];
        }
    }
    return pinYinStr;
}
Swift

在String的扩展中添加该方法:

extension String{

    func pinYin() ->String{
        var pinYinStr = String();
        let pinyin:CFMutableString = NSMutableString(string: self) as CFMutableString;
    
        //先转换为带声调的拼音
        if CFStringTransform(pinyin, nil, kCFStringTransformMandarinLatin, false){
            print(pinyin);
        }
    
        //再转换为不带声调的拼音
        if CFStringTransform(pinyin, nil, kCFStringTransformStripDiacritics, false){
            print(pinyin);
        
            //再去除空格,将拼音连在一起
            pinYinStr = pinyin as String;
            pinYinStr = pinYinStr.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)
            pinYinStr = pinYinStr.replacingOccurrences(of: "\r", with: "")
            pinYinStr = pinYinStr.replacingOccurrences(of: "\n", with: "")
            pinYinStr = pinYinStr.replacingOccurrences(of: " ", with: "")
        }
        return pinYinStr;
    }

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 使用CFStringTransform CFStringTransform(<#CFMutableStringRe...
    GX_Dust阅读 3,658评论 0 1
  • 1、随机数 不需要随机数种子 arc4random()%N + begin:产生begin~begin+N的随机数...
    我是小胡胡123阅读 9,755评论 0 2
  • 将近20个年头了,回顾这么多年的日子,总感觉缺少点什么。是开心,是难过,是很多很多的情感吧。不知道从什么时候,自己...
    dohyl阅读 2,548评论 2 1
  • 别人的成功其实无法复制,但是成功的经验可以参考借鉴。 书法,写作,演讲,舞蹈,这些开始的时候都是依靠大量模仿简单动...
    赵慧姿阅读 1,235评论 0 1
  • 本文出处:炎之铠csdn博客:http://blog.csdn.net/totond炎之铠邮箱:yanzhikai...
    炎之铠阅读 11,683评论 4 26