CFStringTransform-知识要点
[详解]
-
1.简介
iOS在CoreFoundation中提供了CFStringTransform函数,但在 Foundation中却没有相对应的方法。它的定义如下:
Boolean CFStringTransform(CFMutableStringRef string, CFRange *range, CFStringRef transform, Boolean reverse); -
2.参数解析:
string->要转换的string
比如要转换的中文,同时它是mutable的,因此也可直接作为最终转换后的字符串。
range->要转换的范围,同时输出转换后改变的范围
如果为NULL,视为全部转换。
transform->指定要进行什么样的转换
可以指定多种语言的拼写转换。
reverse->该转换是否必须是可逆向转换的
如果转换成功就返回true,否则返回false。
-
3.转换方法
3.1如果要进行汉字到拼音的转换
--可以将transform设定为kCFStringTransformMandarinLati --或者是kCFStringTransformToLatin kCFStringTransformToLatin也可适用于非汉字字符串
3.2代码示例:
CFMutableStringRef string =CFStringCreateMutableCopy(NULL, 0, CFSTR("中国"));
CFStringTransform(string,NULL,kCFStringTransformMandarinLatin, NO);
NSLog(@"%@", string);
这段代码将输出:
2016-7-4 14:41:14.644 Test[2436:907] zhōng guó
解析:
- 可以看出,*CFStringTransform* 正确的输出了“中国”的拼音,而且还带上了音标。
######*-->有时候我们不需要音标怎么办?*
- 还好CFStringTransform同时提供了将音标字母转换为普通字母的方法kCFStringTransformStripDiacritics。
**>我们在上面的代码基础上再加上这个:**
CFStringTransform(string,NULL,kCFStringTransformStripDiacritics, NO);
NSLog(@"%@", string);
$$$->那么最终将输出
2016-7-4 14:47:00.380 Test[2470:907] zhong guo
-
4.示例代码:
- 主要逻辑:
CFStringTransform中string参数是要转换的中文字符串,需要将它转化成mutable的,该方法将它最终转成中文的拼音字符串,系统会将每个汉字的拼音用空格分隔开,可将空格替换将其拼接在一起。range是要转换的范围,同时输出转换后改变的范围,如果为nil,代表全部转换,也可传入UnsafeMutablePointer(bitPattern: 0)。transform则指定要进行什么样的转换,这里可以指定多种语言的拼写转换。reverse指定该转换是否必须是可逆向转换的。返回true表示转换成功,false表示转换失败。
/** 中文转拼音 */
- (NSString *)pinYinWithString:(NSString *)chinese
{
NSString * pinYinStr = [NSString string];
if (chinese.length){
NSMutableString * pinYin = [[NSMutableString alloc]initWithString:chinese];
//1.先转换为带声调的拼音
if(CFStringTransform((__bridgeCFMutableStringRef)pinYin, 0, kCFStringTransformMandarinLatin, NO)) {
NSLog(@"pinyin: %@", pinYin);
}
//2.再转换为不带声调的拼音
if (CFStringTransform((__bridgeCFMutableStringRef)pinYin, 0, kCFStringTransformStripDiacritics, NO)) {
NSLog(@"pinyin: %@", pinYin);
//3.去除掉首尾的空白字符和换行字符
pinYinStr = [pinYinStr stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
//4.去除掉其它位置的空白字符和换行字符
pinYinStr = [pinYinStr stringByReplacingOccurrencesOfString:@"\r" withString:@""];
pinYinStr = [pinYinStr stringByReplacingOccurrencesOfString:@"\n" withString:@""];
pinYinStr = [pinYinStr stringByReplacingOccurrencesOfString:@" " withString:@""];
}
}
return pinYinStr;
}
- 注意:也可给NSString添加个分类,实现该方法。