iOS-使用CFStringTransform漢字轉拼音

Demo_github

圖片源于網絡

在CoreFoundation中提供了CFStringTransform函數。但在 Foundation中卻沒有相對應的方法。它在CoreFoundation的定義如下:

/* Perform string transliteration.  The transformation represented by transform is applied to the given range of string, modifying it in place. Only the specified range will be modified, but the transform may look at portions of the string outside that range for context. NULL range pointer causes the whole string to be transformed. On return, range is modified to reflect the new range corresponding to the original range. reverse indicates that the inverse transform should be used instead, if it exists. If the transform is successful, true is returned; if unsuccessful, false. Reasons for the transform being unsuccessful include an invalid transform identifier, or attempting to reverse an irreversible transform.

You can pass one of the predefined transforms below, or any valid ICU transform ID as defined in the ICU User Guide. Note that we do not support arbitrary set of ICU transform rules.
*/
CF_EXPORT
Boolean CFStringTransform(CFMutableStringRef string, CFRange *range,  CFStringRef transform, Boolean reverse);

CFStringTransform函數參數解析

  • CFMutableStringRef string

    是要轉換的string,比如要轉換的中文,同時它是mutable的艾岂,因此也可直接作為最終轉換后的字符串。

  • CFRange *range

    是要轉換的范圍,同時輸出轉換后改變的范圍褒侧。如果為NULL,視為全部轉換。

  • CFStringRef transform

    是指定要進行什么樣的轉換,可以指定多種語言的拼寫轉換闷供。在CoreFoundation中CFStringRef 的定義如下:

/* Transform identifiers for CFStringTransform()
*/
CF_EXPORT const CFStringRef kCFStringTransformStripCombiningMarks;//去掉重音和變音符號
CF_EXPORT const CFStringRef kCFStringTransformToLatin;//非英文文本轉換為拉丁字母
CF_EXPORT const CFStringRef kCFStringTransformFullwidthHalfwidth;
CF_EXPORT const CFStringRef kCFStringTransformLatinKatakana;
CF_EXPORT const CFStringRef kCFStringTransformLatinHiragana;
CF_EXPORT const CFStringRef kCFStringTransformHiraganaKatakana;
CF_EXPORT const CFStringRef kCFStringTransformMandarinLatin;
CF_EXPORT const CFStringRef kCFStringTransformLatinHangul;
CF_EXPORT const CFStringRef kCFStringTransformLatinArabic;
CF_EXPORT const CFStringRef kCFStringTransformLatinHebrew;
CF_EXPORT const CFStringRef kCFStringTransformLatinThai;
CF_EXPORT const CFStringRef kCFStringTransformLatinCyrillic;
CF_EXPORT const CFStringRef kCFStringTransformLatinGreek;
CF_EXPORT const CFStringRef kCFStringTransformToXMLHex;
CF_EXPORT const CFStringRef kCFStringTransformToUnicodeName;
CF_EXPORT const CFStringRef kCFStringTransformStripDiacritics CF_AVAILABLE(10_5, 2_0);
  • Boolean reverse

    該轉換是否必須是可逆向轉換的烟央。如果轉換成功就返回true,否則返回false歪脏。

CFStringTransform函數使用

  • 如果要進行漢字到拼音的轉換疑俭,我們只需要將transform設定為kCFStringTransformMandarinLatin或者kCFStringTransformToLatin(kCFStringTransformToLatin也可適用于非漢字字符串):
          //1.先轉換為帶聲調的拼音
          if(CFStringTransform((__bridge CFMutableStringRef)pinYin, NULL, kCFStringTransformMandarinLatin, NO)) {
              NSLog(@"帶聲調的pinyin: %@", pinYin);
          }
    

    其輸出結果如下:

    帶聲調的pinyin: hàn zì zhuǎn pīn yīn
    
  • 如果要去掉音標,我們只需要將transform設定為kCFStringTransformStripDiacritics :
     //2.再轉換為不帶聲調的拼音
    if (CFStringTransform((__bridge CFMutableStringRef)pinYin, NULL, kCFStringTransformStripDiacritics, NO)) {
         NSLog(@"不帶聲調的pinyin: %@", pinYin);
     }      
    

    其輸出結果如下:

    不帶聲調的pinyin: han zi zhuan pin yin
    
  • 以上轉成的拼音字符串婿失,系統(tǒng)會將每個漢字的拼音用空格分隔開钞艇,如果要去掉空白字符和換行字符,我們要對轉換的拼音字符串進行額外的操作:
          //3.去除掉首尾的空白字符和換行字符
          pinYinStr = [pinYin stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
          //4.去除掉其它位置的空白字符和換行字符
          pinYinStr = [pinYinStr stringByReplacingOccurrencesOfString:@"\r" withString:@""];
          pinYinStr = [pinYinStr stringByReplacingOccurrencesOfString:@"\n" withString:@""];
          pinYinStr = [pinYinStr stringByReplacingOccurrencesOfString:@" " withString:@""];
    

    其輸出結果如下:

  去掉空白字符和換行字符的pinyin:   hanzizhuanpinyin
  • 字符串大小寫轉換豪硅,首字母大寫(NSString.h)
    @property (readonly, copy) NSString *uppercaseString;//大寫
    @property (readonly, copy) NSString *lowercaseString;//小寫
    @property (readonly, copy) NSString *capitalizedString;//首字母大寫
    
    如果是要自己實現(xiàn)的話哩照,需要考慮一下ASCII碼,大小寫之間的差值是32懒浮,A是65葡秒,a是97,代碼如下:
    -(NSString *)toLower:(NSString *)str{
     for (NSInteger i=0; i<str.length; i++) {
         if ([str characterAtIndex:i]>='A'&[str characterAtIndex:i]<='Z') {
             //A  65  a  97
             char  temp=[str characterAtIndex:i]+32;
             NSRange range=NSMakeRange(i, 1);
             str=[str stringByReplacingCharactersInRange:range withString:[NSString stringWithFormat:@"%c",temp]];
         }
     }
     return str;
    }
    -(NSString *)toUpper:(NSString *)str{
     for (NSInteger i=0; i<str.length; i++) {
         if ([str characterAtIndex:i]>='a'&[str characterAtIndex:i]<='z') {
             //A  65  a  97
             char  temp=[str characterAtIndex:i]-32;
             NSRange range=NSMakeRange(i, 1);
             str=[str stringByReplacingCharactersInRange:range withString:[NSString stringWithFormat:@"%c",temp]];
         }
     }
     return str;
    }
    
  • 字符串與數組相互轉換
  NSArray *arrays = @[@"1,2,3,4,5,6"];
  NSString *string = [arrays componentsJoinedByString:@","];//數組轉換成字符串,根據@","
  NSArray *array = [string componentsSeparatedByString:@","];//字符串轉換成數組嵌溢,根據@","
  NSLog(@"轉換成的string:--- %@",string);
  NSLog(@"轉換成的array:--- %@",array);

示范代碼:

+ (NSString *)transformPinYinWithString:(NSString *)chinese
{
     NSString  * pinYinStr = [NSString string];
    if (chinese.length){
        NSMutableString * pinYin = [[NSMutableString alloc]initWithString:chinese];
        //1.先轉換為帶聲調的拼音
        if(CFStringTransform((__bridge CFMutableStringRef)pinYin, NULL, kCFStringTransformMandarinLatin, NO)) {
            NSLog(@"帶聲調的pinyin: %@", pinYin);
        }
        //2.再轉換為不帶聲調的拼音
        if (CFStringTransform((__bridge CFMutableStringRef)pinYin, NULL, kCFStringTransformStripDiacritics, NO)) {
            NSLog(@"不帶聲調的pinyin: %@", pinYin);
        }
        //3.去除掉首尾的空白字符和換行字符
        pinYinStr = [pinYin stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
        //4.去除掉其它位置的空白字符和換行字符
        pinYinStr = [pinYinStr stringByReplacingOccurrencesOfString:@"\r" withString:@""];
        pinYinStr = [pinYinStr stringByReplacingOccurrencesOfString:@"\n" withString:@""];
        pinYinStr = [pinYinStr stringByReplacingOccurrencesOfString:@" " withString:@""];
        NSLog(@"去掉空白字符和換行字符的pinyin: %@", pinYinStr);
        [pinYinStr capitalizedString];

    }
    return pinYinStr;
}

Demo_github

參考文章

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末眯牧,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子赖草,更是在濱河造成了極大的恐慌学少,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秧骑,死亡現(xiàn)場離奇詭異版确,居然都是意外死亡,警方通過查閱死者的電腦和手機乎折,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門绒疗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人骂澄,你說我怎么就攤上這事吓蘑。” “怎么了坟冲?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵磨镶,是天一觀的道長。 經常有香客問我健提,道長琳猫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任私痹,我火速辦了婚禮脐嫂,結果婚禮上统刮,老公的妹妹穿的比我還像新娘。我一直安慰自己账千,他們只是感情好侥蒙,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蕊爵,像睡著了一般辉哥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上攒射,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天醋旦,我揣著相機與錄音,去河邊找鬼会放。 笑死饲齐,一個胖子當著我的面吹牛,可吹牛的內容都是我干的咧最。 我是一名探鬼主播捂人,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼矢沿!你這毒婦竟也來了滥搭?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤捣鲸,失蹤者是張志新(化名)和其女友劉穎瑟匆,沒想到半個月后,有當地人在樹林里發(fā)現(xiàn)了一具尸體栽惶,經...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡愁溜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了外厂。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冕象。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖汁蝶,靈堂內的尸體忽然破棺而出渐扮,到底是詐尸還是另有隱情,我是刑警寧澤穿仪,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布席爽,位于F島的核電站,受9級特大地震影響啊片,放射性物質發(fā)生泄漏。R本人自食惡果不足惜玖像,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一紫谷、第九天 我趴在偏房一處隱蔽的房頂上張望齐饮。 院中可真熱鬧,春花似錦笤昨、人聲如沸祖驱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捺僻。三九已至,卻和暖如春崇裁,著一層夾襖步出監(jiān)牢的瞬間匕坯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工拔稳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留葛峻,地道東北人。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓巴比,卻偏偏與公主長得像术奖,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子轻绞,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內容

  • /**ios常見的幾種加密方法: 普通的加密方法是講密碼進行加密后保存到用戶偏好設置( [NSUserDefaul...
    彬至睢陽閱讀 2,931評論 0 7
  • 原文 在這里總結一些iOS開發(fā)中的小技巧采记,能大大方便我們的開發(fā),持續(xù)更新政勃。 1.UITableView的Group...
    無灃閱讀 774評論 0 2
  • Lancy's Blog Blog Archives About MeTwitterWeiboGitHubRSS ...
    其實也沒有閱讀 5,489評論 0 24
  • 【讓右腦和左腦一起狂歡】品思視覺思維導圖后記 當收到要交心得作業(yè)唧龄,感覺回到n世紀的學生年代。日常都是寫方案稼病、計劃选侨、...
    FionaJ閱讀 890評論 0 3
  • 一直是一個懷揣遠大理想援制,卻不舍得邁步的人。每年都會買一本特別厚的的日程本芍瑞,計劃這一年不能荒廢晨仑,設立了很多很多...
    vanessaR閱讀 216評論 0 0