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
    
  • 以上轉成的拼音字符串,系統會將每個漢字的拼音用空格分隔開,如果要去掉空白字符和換行字符,我們要對轉換的拼音字符串進行額外的操作:
          //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;//首字母大寫
    
    如果是要自己實現的話,需要考慮一下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

參考文章

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容