iOS 漢字 -- 拼音處理

1.將漢字轉(zhuǎn)換成拼音


轉(zhuǎn)換成不帶音標(biāo)的拼音


//轉(zhuǎn)換成拼音
CFStringTransform((__bridge CFMutableStringRef)chinese,
                      0,
                      kCFStringTransformMandarinLatin,
                      NO);
//去掉音調(diào)[要音調(diào)的就不要這個(gè)]
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.先拆掉聲母 拆聲母的時(shí)候要注意 z c s
2.拆掉聲母后就只剩下韻母了
3.拆掉聲母后有兩種情況:一是沒(méi)有聲母的就為單拼音,此時(shí)不需要在拆分韻母了。
二是有聲母窒朋,接下來(lái)就需要繼續(xù)拆分韻母了
4.拆分韻母:先看韻母的長(zhǎng)度,首先:>=4的話就是三音節(jié)的,韻母的首字母為介母,
剩下的是后韻母,那這種情況就可以直接拆分了常遂。如果在4個(gè)字以內(nèi),在事先準(zhǔn)備好的
字母表里邊去查找(查找和韻母部分相同長(zhǎng)度的字母表),找到了就是雙拼音節(jié),直接
返回拆分的結(jié)果;如果沒(méi)有找到诫给,那就是三拼音節(jié),去掉首字母后剩下的就是韻母镀钓。
下邊是拆分拼音的實(shí)現(xiàn)


QKPinYin.h

typedef enum
{
    /**
     *  單拼音節(jié)
     */
    QKDanPinYinJie    = 1,
    /**
     *  雙拼音節(jié)
     */
    QKShuangPinYinJie  = 2,
    /**
     *  三拼音節(jié)
     */
    QKSanPinYinJie     = 3,
    
    
} QKPinYinJieType;

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

/**
 *  音節(jié)的類型
 */
@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

內(nèi)部需要的數(shù)據(jù)

  @interface QKPinYin ()

/**
 *  聲母 z s c --> +h后也是聲母
 */
@property (nonatomic,strong)NSArray *shengMuArr;
/**
 *  1個(gè)字母的韻母
 */
@property (nonatomic,strong)NSArray *oneYunArr;
/**
 *  2個(gè)字母的韻母
 */
@property (nonatomic,strong)NSArray *twoYunArr;
/**
 *  3個(gè)字母的韻母
 */
@property (nonatomic,strong)NSArray *threeYunArr;

@end 

初始化數(shù)據(jù)

- (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(@"輸入的拼音有問(wèn)題,不能轉(zhuǎn)換");
        return;
    }
    
    //拼音的長(zhǎng)度
    NSUInteger length = [pinYin length];
    
    if (length == 1)
    {
        //只有1個(gè)字符,只有韻母
        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
        {
            //沒(méi)有聲母 單拼音節(jié)
            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)
                {
                    //雙拼音節(jié)
                    self.yunMu = [pinYin substringWithRange:NSMakeRange(2, 1)];
                    self.jieMu = @"";
                    self.yinJieType = QKShuangPinYinJie;
                    return;
                    
                }else
                {
                    //不清楚音節(jié)
                    NSString *subShengMu = [pinYin substringWithRange:NSMakeRange(2, length-2)];
                    [self subYunMu:subShengMu
                         haveShengMu:YES];
                    
                    return;
                    
                }
                
            }
            else
            {
                //聲母是z c s
                //不清楚音節(jié)
                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 開(kāi)頭的 需要從字母表里邊查找
            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
   {
       //三音節(jié)
       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)
    {
        //沒(méi)有介母
        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;
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末居灯,一起剝皮案震驚了整個(gè)濱河市祭务,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌怪嫌,老刑警劉巖义锥,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異岩灭,居然都是意外死亡拌倍,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門噪径,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)柱恤,“玉大人,你說(shuō)我怎么就攤上這事找爱」K常” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵缴允,是天一觀的道長(zhǎng)荚守。 經(jīng)常有香客問(wèn)我珍德,道長(zhǎng)练般,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任锈候,我火速辦了婚禮薄料,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘泵琳。我一直安慰自己摄职,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布获列。 她就那樣靜靜地躺著谷市,像睡著了一般。 火紅的嫁衣襯著肌膚如雪击孩。 梳的紋絲不亂的頭發(fā)上迫悠,一...
    開(kāi)封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音巩梢,去河邊找鬼创泄。 笑死艺玲,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的鞠抑。 我是一名探鬼主播饭聚,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼搁拙!你這毒婦竟也來(lái)了秒梳?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤箕速,失蹤者是張志新(化名)和其女友劉穎端幼,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體弧满,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡婆跑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了庭呜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片滑进。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖募谎,靈堂內(nèi)的尸體忽然破棺而出扶关,到底是詐尸還是另有隱情,我是刑警寧澤数冬,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布节槐,位于F島的核電站,受9級(jí)特大地震影響拐纱,放射性物質(zhì)發(fā)生泄漏铜异。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一秸架、第九天 我趴在偏房一處隱蔽的房頂上張望揍庄。 院中可真熱鬧,春花似錦东抹、人聲如沸蚂子。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)食茎。三九已至,卻和暖如春馏谨,著一層夾襖步出監(jiān)牢的瞬間别渔,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留钠糊,地道東北人挟秤。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像抄伍,于是被迫代替她去往敵國(guó)和親艘刚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容