#iOS 獲取字符串中的單個字符服務器
要取到單個字符,就要知道字符串的編碼方式,這樣纔可以定位每一個字符在內存中的位置。可是,iOS的字符串編碼是不固定的,所以,須要設置一個統一的編碼格式,將全部其餘格式的字符串都轉化爲統一的格式,而後就能夠根據編碼規則取到單個字符了。在這裏,使用UTF-8編碼。UTF-8編碼的使用範圍比較普遍,客戶端與服務器之間傳輸的數據大多以UTF-8編碼。編碼
關於UTF-8的詳細說明能夠Wiki下:UTF-8。code
下圖是UTF-8編碼的格式:orm
開發的流程大概是:對象
**有一點要注意:ip
<!-- lang: cpp --> NSString *string = [NSString stringWithFormat:@"1a張"]; const char *chars = [string cStringUsingEncoding:NSUTF8StringEncoding]; for (int i = 0; i < strlen(chars); i++) { printf("%x", chars[i]); }
輸出:3161ffffffe5ffffffbcffffffa0內存
在iOS中,非ASCII字符的前面都會加上ffffff,而不是直接使用UTF-8中規定的起始值。開發
下面是代碼實現(使用類別):字符串
NSString+StringToWords.hget
<!-- lang: cpp --> #import <Foundation/Foundation.h> @interface NSString (StringToWords) - (NSArray *)words; @end
NSString+StringToWords.h
<!-- lang: cpp --> #import "NSString+StringToWords.h" @implementation NSString (StringToWords) - (NSArray *)words { #if ! __has_feature(objc_arc) NSMutableArray *words = [[[NSMutableArray alloc] init] autorelease]; #else NSMutableArray *words = [[NSMutableArray alloc] init]; #endif const char *str = [self cStringUsingEncoding:NSUTF8StringEncoding]; char *word; for (int i = 0; i < strlen(str);) { int len = 0; if (str[i] >= 0xFFFFFFFC) { len = 6; } else if (str[i] >= 0xFFFFFFF8) { len = 5; } else if (str[i] >= 0xFFFFFFF0) { len = 4; } else if (str[i] >= 0xFFFFFFE0) { len = 3; } else if (str[i] >= 0xFFFFFFC0) { len = 2; } else if (str[i] >= 0x00) { len = 1; } word = malloc(sizeof(char) * (len + 1)); for (int j = 0; j < len; j++) { word[j] = str[j + i]; } word[len] = '\0'; i = i + len; NSString *oneWord = [NSString stringWithCString:word encoding:NSUTF8StringEncoding]; free(word); [words addObject:oneWord]; } return words; } @end