圖片源于網絡
在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)
如果是要自己實現(xiàn)的話哩照,需要考慮一下ASCII碼,大小寫之間的差值是32懒浮,A是65葡秒,a是97,代碼如下:@property (readonly, copy) NSString *uppercaseString;//大寫 @property (readonly, copy) NSString *lowercaseString;//小寫 @property (readonly, copy) NSString *capitalizedString;//首字母大寫
-(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;
}