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;
}
}