主要使用CFStringTransform方法:
Object-C : Boolean CFStringTransform(CFMutableStringRef string, CFRange *range, CFStringRef transform, Boolean reverse);
Swift : public func CFStringTransform(_ string: CFMutableString!, _ range: UnsafeMutablePointer!, _ transform: CFString!, _ reverse: Bool) -> Bool
其中string参数是要被转换的中文字符串,需要将它转化成mutable的,该方法将它最终转成中文的拼音字符串,系统会将每个汉字的拼音用空格分隔开,可将空格替换将其拼接在一起。range是要转换的范围,同时输出转换后改变的范围,如果为nil,代表全部转换,也可传入UnsafeMutablePointer(bitPattern: 0)。transform则指定要进行什么样的转换,这里可以指定多种语言的拼写转换。reverse指定该转换是否必须是可逆向转换的。
transform 参数值 | 说明 |
---|---|
kCFStringTransformStripCombiningMarks | 删除重音符号 |
kCFStringTransformToLatin | 中文的拉丁字母 |
kCFStringTransformFullwidthHalfwidth | 全角半宽 |
kCFStringTransformLatinKatakana | 片假名拉丁字母 |
kCFStringTransformLatinHiragana | 平假名拉丁字母 |
kCFStringTransformHiraganaKatakana | 平假名片假名 |
kCFStringTransformMandarinLatin | 普通话拉丁字母 |
kCFStringTransformLatinHangul | 韩文的拉丁字母 |
kCFStringTransformLatinArabic | 阿拉伯语拉丁字母 |
kCFStringTransformLatinHebrew | 希伯来语拉丁字母 |
kCFStringTransformLatinThai | 泰国拉丁字母 |
kCFStringTransformLatinCyrillic | 西里尔拉丁字母 |
kCFStringTransformLatinGreek | 希腊拉丁字母 |
kCFStringTransformToXMLHex | 转换为XML十六进制字符 |
kCFStringTransformToUnicodeName | 转换为Unicode的名称 |
kCFStringTransformStripDiacritics | 转换成不带音标的符号 |
Object-C
- (NSString *)pinYinWithString:(NSString *)chinese{
NSString * pinYinStr = [NSString string];
if (chinese.length){
NSMutableString * pinYin = [[NSMutableString alloc]initWithString:chinese];
//先转换为带声调的拼音
if (CFStringTransform((__bridge CFMutableStringRef)pinYin, 0, kCFStringTransformMandarinLatin, NO)) {
NSLog(@"pinyin: %@", pinYin);
}
//再转换为不带声调的拼音
if (CFStringTransform((__bridge CFMutableStringRef)pinYin, 0, kCFStringTransformStripDiacritics, NO)) {
NSLog(@"pinyin: %@", pinYin);
//再去除空格,将拼音连在一起
pinYinStr = [NSString stringWithString:pinYin];
// 去除掉首尾的空白字符和换行字符
pinYinStr = [pinYinStr stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
// 去除掉其它位置的空白字符和换行字符
pinYinStr = [pinYinStr stringByReplacingOccurrencesOfString:@"\r" withString:@""];
pinYinStr = [pinYinStr stringByReplacingOccurrencesOfString:@"\n" withString:@""];
pinYinStr = [pinYinStr stringByReplacingOccurrencesOfString:@" " withString:@""];
}
}
return pinYinStr;
}
Swift
在String的扩展中添加该方法:
extension String{
func pinYin() ->String{
var pinYinStr = String();
let pinyin:CFMutableString = NSMutableString(string: self) as CFMutableString;
//先转换为带声调的拼音
if CFStringTransform(pinyin, nil, kCFStringTransformMandarinLatin, false){
print(pinyin);
}
//再转换为不带声调的拼音
if CFStringTransform(pinyin, nil, kCFStringTransformStripDiacritics, false){
print(pinyin);
//再去除空格,将拼音连在一起
pinYinStr = pinyin as String;
pinYinStr = pinYinStr.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)
pinYinStr = pinYinStr.replacingOccurrences(of: "\r", with: "")
pinYinStr = pinYinStr.replacingOccurrences(of: "\n", with: "")
pinYinStr = pinYinStr.replacingOccurrences(of: " ", with: "")
}
return pinYinStr;
}
}