zoukankan      html  css  js  c++  java
  • iOS开发-中文转拼音

    使用CFStringTransform将汉字转换为拼音

    之前做通讯录相关的一些App时,有一个比较常用的算法是将汉字转换成拼音。当时采用的做法是:将各个拼音段的首个汉字(按Unicode排序)做成两个 数组,一个数组存拼音,另一个数组存拼音对应首个汉字的Unicode。如果要获取某个汉字的拼音,可以折半查找法找的对应拼音。最近无意间发现CFStringTransform这篇文章后,发现系统本身已经提供了一个这样的函数。


    CFStringTransform

    iOS在CoreFoundation中提供了CFStringTransform函数,但在Foundation中却没有相对应的方法。它的定义如下:

    Boolean CFStringTransform(CFMutableStringRef string, CFRange *range, CFStringRef transform, Boolean reverse);

    其中string参数是要转换的string,比如要转换的中文,同时它是mutable的,因此也直接作为最终转换后的字符串。range是要转换的范围,同时输出转换后改变的范围,如果为NULL,视为全部转换。transform可以指定要进行什么样的转换,这里可以指定多种语言的拼写转换。reverse指定该转换是否必须是可逆向转换的。如果转换成功就返回true,否则返回false

    如果要进行汉字到拼音的转换,我们只需要将transform设定为kCFStringTransformMandarinLatin或者kCFStringTransformToLatinkCFStringTransformToLatin也可适用于非汉字字符串):

    CFMutableStringRef string = CFStringCreateMutableCopy(NULL, 0, CFSTR("中国"));
    CFStringTransform(string, NULL, kCFStringTransformMandarinLatin, NO);
    NSLog(@"%@", string);

    这段代码将输出:

    2013-11-22 14:41:14.644 Test[2436:907] zhōng guó

    可以看出,CFStringTransform正确的输出了“中国”的拼音,而且还带上了音标。有时候我们不需要音标怎么办?还好CFStringTransform同时提供了将音标字母转换为普通字母的方法kCFStringTransformStripDiacritics。我们在上面的代码基础上再加上这个:

    CFStringTransform(string, NULL, kCFStringTransformStripDiacritics, NO);
    NSLog(@"%@", string);

    那么最终将输出:

    2013-11-22 14:47:00.380 Test[2470:907] zhong guo

    示例

    NSString *hanziText = @"我是中国人";  
    if ([hanziText length]) {  
        NSMutableString *ms = [[NSMutableString alloc] initWithString:hanziText];  
        if (CFStringTransform((__bridge CFMutableStringRef)ms, 0, kCFStringTransformMandarinLatin, NO)) {  
            NSLog(@"pinyin: %@", ms);  
        }  
        if (CFStringTransform((__bridge CFMutableStringRef)ms, 0, kCFStringTransformStripDiacritics, NO)) {  
            NSLog(@"pinyin: %@", ms);  
        }  
    }

     

     

    参考文章

    http://nshipster.com/cfstringtransform/

  • 相关阅读:
    关于课内外读物的建议
    c# Aes加解密
    web api 如何通过接收文件流的方式,接收客户端及前端上传的文件
    c# 文件夹权限
    mysql 8创建远程访问用户以及连接mysql速度慢的解决方法
    为什么读书?读书让我们明心见性!
    大部分教程不会告诉你的 12 个 JS 技巧
    nuget包管理nuget服务器发布包时出现请求报错 406 (Not Acceptable)
    Python 实现毫秒级淘宝、京东、天猫等秒杀抢购脚本
    eos的资源和工具列表
  • 原文地址:https://www.cnblogs.com/dingjianjaja/p/5015036.html
Copyright © 2011-2022 走看看