iOS 汉字 -- 拼音处理

1.将汉字转换成拼音


转换成不带音标的拼音


//转换成拼音
CFStringTransform((__bridge CFMutableStringRef)chinese,
                      0,
                      kCFStringTransformMandarinLatin,
                      NO);
//去掉音调[要音调的就不要这个]
CFStringTransform((__bridge CFMutableStringRef)chinese,
                      0,
                      kCFStringTransformStripDiacritics,
                      NO);
 

2.拼音的分割


韵母表:
a o e i u ü
ai ei ui ao ou iu ie üe er
an en in un ün
ang eng ing ong

声母表
@"b",@"p",@"m",@"f",@"d",
@"t",@"n",@"l",@"g",@"k",
@"h",@"j",@"q",@"x",

@"zh",@"ch",@"sh",@"z",@"c",@"s"

拆拼音法
1.先拆掉声母 拆声母的时候要注意 z c s
2.拆掉声母后就只剩下韵母了
3.拆掉声母后有两种情况:一是没有声母的就为单拼音,此时不需要在拆分韵母了。
二是有声母,接下来就需要继续拆分韵母了
4.拆分韵母:先看韵母的长度,首先:>=4的话就是三音节的,韵母的首字母为介母,
剩下的是后韵母,那这种情况就可以直接拆分了。如果在4个字以内,在事先准备好的
字母表里边去查找(查找和韵母部分相同长度的字母表),找到了就是双拼音节,直接
返回拆分的结果;如果没有找到,那就是三拼音节,去掉首字母后剩下的就是韵母。
下边是拆分拼音的实现


QKPinYin.h

typedef enum
{
    /**
     *  单拼音节
     */
    QKDanPinYinJie    = 1,
    /**
     *  双拼音节
     */
    QKShuangPinYinJie  = 2,
    /**
     *  三拼音节
     */
    QKSanPinYinJie     = 3,
    
    
} QKPinYinJieType;

/**
 *  拼音处理
 */
@interface QKPinYin : NSObject

/**
 *  音节的类型
 */
@property (nonatomic,assign)QKPinYinJieType yinJieType;

/**
 *  声母
 */
@property (nonatomic,copy)NSString *shengMu;

/**
 *  介母
 */
@property (nonatomic,copy)NSString *jieMu;

/**
 *  韵母
 */
@property (nonatomic,copy)NSString *yunMu;

/**
 *  拆分拼音
 *
 *  @param pinYin 拼音
 */
- (void)cutPinYin:(NSString *)pinYin;

@end
  • QKPinYin.m

内部需要的数据

  @interface QKPinYin ()

/**
 *  声母 z s c --> +h后也是声母
 */
@property (nonatomic,strong)NSArray *shengMuArr;
/**
 *  1个字母的韵母
 */
@property (nonatomic,strong)NSArray *oneYunArr;
/**
 *  2个字母的韵母
 */
@property (nonatomic,strong)NSArray *twoYunArr;
/**
 *  3个字母的韵母
 */
@property (nonatomic,strong)NSArray *threeYunArr;

@end 

初始化数据

- (instancetype)init
{
   self = [super init];
   
   if (self)
   {
       //声母
       self.shengMuArr = @[
                           @"b",@"p",@"m",@"f",@"d",
                           @"t",@"n",@"l",@"g",@"k",
                           @"h",@"j",@"q",@"x",
                           @"zh",@"ch",@"sh",
                           @"z",@"c",@"s",@"y",
                           @"w",@"r"
                           ];
       //单韵母
       self.oneYunArr = @[
                         @"a",@"o",@"e",@"i",@"u",@"ü",
                         ];
       
      //双韵母
       self.twoYunArr = @[
                          @"ai",@"ei",@"ui",@"ao",
                          @"ou",@"iu",@"ie",@"üe",@"er",
                          @"an",@"en",@"in",@"un",@"ün"
                          ];
       
       //三韵母
       self.threeYunArr = @[
                            @"ang",@"eng",@"ing",@"ong",
                            ];
       
       
   }
   return self;
}

第一步拆分

- (void)cutPinYin:(NSString *)pinYin
{
    if (!pinYin || [pinYin length] == 0)
    {
        NSLog(@"输入的拼音有问题,不能转换");
        return;
    }
    
    //拼音的长度
    NSUInteger length = [pinYin length];
    
    if (length == 1)
    {
        //只有1个字符,只有韵母
        self.shengMu = @"";
        self.yunMu = pinYin;
        self.jieMu = @"";
        self.yinJieType = QKDanPinYinJie;
        return;
        
    }else if(length == 2)
    {
        //不可能是zh ch sh
        //首字母
        NSString *firstStr = [pinYin substringWithRange:NSMakeRange(0, 1)];
        NSString *content = [NSString stringWithFormat:@"SELF = '%@'",firstStr];
        NSPredicate *predicate = [NSPredicate predicateWithFormat:content];
        NSArray *resultArr = [self.shengMuArr filteredArrayUsingPredicate:predicate];
        if (resultArr  && [resultArr count] > 0)
        {
            //查到声母了 并且是单声母 单韵母
            self.shengMu = firstStr;
            self.yunMu   = [pinYin substringWithRange:NSMakeRange(1, 1)];
            self.jieMu   = @"";
            self.yinJieType = QKShuangPinYinJie;
            return;
            
        }else
        {
            //没有声母 单拼音节
            self.shengMu = @"";
            self.yunMu = pinYin;
            self.jieMu = @"";
            self.yinJieType = QKDanPinYinJie;
            return;
        }
        
        
    }else
    {
        
        //可以有zh ch sh 了
        NSString *firstStr = [pinYin substringWithRange:NSMakeRange(0, 1)];
        if ([firstStr isEqualToString:@"z"] ||
            [firstStr isEqualToString:@"c"] ||
            [firstStr isEqualToString:@"s"])
        {
            
            NSString *secondStr = [pinYin substringWithRange:NSMakeRange(1, 1)];
            if ([secondStr isEqualToString:@"h"])
            {
                
                 //就是zh ch sh 这一类
                self.shengMu = [pinYin substringWithRange:NSMakeRange(0, 2)];
               
                //接着在看韵母
                if (length == 3)
                {
                    //双拼音节
                    self.yunMu = [pinYin substringWithRange:NSMakeRange(2, 1)];
                    self.jieMu = @"";
                    self.yinJieType = QKShuangPinYinJie;
                    return;
                    
                }else
                {
                    //不清楚音节
                    NSString *subShengMu = [pinYin substringWithRange:NSMakeRange(2, length-2)];
                    [self subYunMu:subShengMu
                         haveShengMu:YES];
                    
                    return;
                    
                }
                
            }
            else
            {
                //声母是z c s
                //不清楚音节
                NSString *subShengMu = [pinYin substringWithRange:NSMakeRange(1, length-1)];
                self.shengMu = [pinYin substringWithRange:NSMakeRange(0, 1)];
                [self subYunMu:subShengMu
                     haveShengMu:YES];
                return;
            }
            
        }
        else
        {
            //不是 z c s 开头的 需要从字母表里边查找
            NSString *firstStr = [pinYin substringWithRange:NSMakeRange(0, 1)];
            NSString *content = [NSString stringWithFormat:@"SELF = '%@'",firstStr];
            NSPredicate *predicate = [NSPredicate predicateWithFormat:content];
            NSArray *resultArr = [self.shengMuArr filteredArrayUsingPredicate:predicate];
            if (resultArr && [resultArr count] > 0)
            {
                //找到了
                 NSString *subShengMu = [pinYin substringWithRange:NSMakeRange(1, length-1)];
                self.shengMu = [pinYin substringWithRange:NSMakeRange(0, 1)];
                [self subYunMu:subShengMu
                     haveShengMu:YES];
                return;
                
            }else
            {
                //只有韵母
                self.shengMu = @"";
                self.yunMu   = pinYin;
                self.jieMu   = @"";
                self.yinJieType = QKDanPinYinJie;
                return;
                
            }
                      
        }
                
    }
    
    
}

第二步拆分:拆分掉声母后拆分韵母

- (void)subYunMu:(NSString *)yunMu
      haveShengMu:(BOOL)have
{
   NSUInteger length = [yunMu length];
   if (length == 1)
   {
       
       self.jieMu = @"";
       self.yunMu = yunMu;
       
       if (have)
       {
           self.yinJieType = QKShuangPinYinJie;
           
       }else
       {
           self.yinJieType = QKDanPinYinJie;
       }
       
       return;
       
   }else if(length == 2)
   {
       
       [self searchJieMu:yunMu
                yunMuArr:self.twoYunArr
             haveShengMu:have];
       
       return;
       
       
   }else if (length == 3)
   {
       [self searchJieMu:yunMu
                yunMuArr:self.threeYunArr
             haveShengMu:have];
       
       return;
       
   }else
   {
       //三音节
       self.jieMu = [yunMu substringWithRange:NSMakeRange(0, 1)];
       self.yunMu = [yunMu substringWithRange:NSMakeRange(1, length-1)];
       self.yinJieType = QKSanPinYinJie;
       return;
       
       
   }
   
   
}

最后的拆分 看韵母种是否有介母

- (void)searchJieMu:(NSString *)yunMu
           yunMuArr:(NSArray *)arr
        haveShengMu:(BOOL)have
{
    NSUInteger length = [yunMu length];
    NSString *content = [NSString stringWithFormat:@"SELF = '%@'",yunMu];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:content];
    NSArray *resultArr = [arr filteredArrayUsingPredicate:predicate];
    if (resultArr && [resultArr count] > 0)
    {
        //没有介母
        self.jieMu = @"";
        self.yunMu = yunMu;
        
        if (have)
        {
            self.yinJieType = QKShuangPinYinJie;
            
        }else
        {
            self.yinJieType = QKDanPinYinJie;
        }
        return;
        
    }else
    {
        //有介母
        self.jieMu = [yunMu substringWithRange:NSMakeRange(0, 1)];
        self.yunMu = [yunMu substringWithRange:NSMakeRange(1, length-1)];
        
        if (have)
        {
            self.yinJieType = QKSanPinYinJie;
            
        }else
        {
            self.yinJieType = QKShuangPinYinJie;
        }
        return;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,922评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,591评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,546评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,467评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,553评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,580评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,588评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,334评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,780评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,092评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,270评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,925评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,573评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,194评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,437评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,154评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容