ios開發 之 中文轉拼音
阿新 • • 發佈:2019-01-23
在專案中顯示通訊錄往往需要把中文名字轉換為拼音來進行排序,為此我封裝了一個類,將中文轉為拼音分享給大家。
思路主要為:
1、使用[CFStringTransform]的[kCFStringTransformMandarinLatin]可以將中文轉為帶音調的拼音
2、使用[CFStringTransform]的[kCFStringTransformStripDiacritics]可以去掉音調符號
3、遍歷字串,將每個字元轉為拼音後可以只取拼音首字母來進行使用
廢話不多說,直接上程式碼:
// // NSString+PinYin.m // ZMPinYinDemo // // Created by ZengZhiming on 2017/3/31. // Copyright © 2017年 菜鳥基地. All rights reserved. // #import "NSString+PinYin.h" @implementation NSString (PinYin) /** 將中文字串轉換為拼音格式(帶聲調) @return 返回帶聲調拼音字串 */ - (NSString *)transformToPinyinTone { // 空值判斷 if (IsNullString(self)) { return @""; } // 將字串轉為NSMutableString型別 NSMutableString *string = [self mutableCopy]; // 將字串轉換為拼音音調格式 CFStringTransform((__bridge CFMutableStringRef)string, NULL, kCFStringTransformMandarinLatin, NO); // 返回帶聲調拼音字串 return string; } /** 將中文字串轉換為拼音格式(不帶聲調) @return 返回不帶聲調拼音字串 */ - (NSString *)transformToPinyin { // 空值判斷 if (IsNullString(self)) { return @""; } // 將字串轉為NSMutableString型別 NSMutableString *string = [self mutableCopy]; // 將字串轉換為拼音音調格式 CFStringTransform((__bridge CFMutableStringRef)string, NULL, kCFStringTransformMandarinLatin, NO); // 去掉音調符號 CFStringTransform((__bridge CFMutableStringRef)string, NULL, kCFStringTransformStripDiacritics, NO); // 返回不帶聲調拼音字串 return string; } /** 將中字串轉換為拼音首字母 @return 拼音首字母字串 */ - (NSString *)transformToFirstLetter { // 空值判斷 if (IsNullString(self)) { return @""; } // 首字母儲存 NSMutableString *firstLetterStirng = [NSMutableString string]; // 遍歷字串中的所有字元 for (NSUInteger i = 0; i < self.length; i++) { // 將每個字元擷取後進行拼音轉換 NSString *charStr = [self substringWithRange:NSMakeRange(i, 1)]; NSString *pinyin = [charStr transformToPinyin]; // 儲存轉換後的拼音首字母 [firstLetterStirng appendString:[pinyin substringToIndex:1]]; } // 返回中文首字母字串 return [firstLetterStirng uppercaseString]; } @end
使用也非常簡單:
/** 拼音轉換按鈕點選 */ - (IBAction)onPinYinAction:(UIButton *)sender { // 顯示帶聲調的拼音 _pinyinToneLabel.text = [_textField.text transformToPinyinTone]; // 顯示不帶聲調的拼音 _pinyinLabel.text = [_textField.text transformToPinyin]; // 顯示拼音首字母 _firstLetterlLabel.text = [_textField.text transformToFirstLetter]; }
如果大家有更好的拼音轉換方式,請在部落格留言,本人不勝感激。