iOS 獲取字符串中的單個字符
要取到單個字符,就要知道字符串的編碼方式,這樣纔可以定位每一個字符在內存中的位置。可是,iOS的字符串編碼是不固定的,所以,須要設置一個統一的編碼格式,將全部其餘格式的字符串都轉化爲統一的格式,而後就能夠根據編碼規則取到單個字符了。在這裏,使用UTF-8編碼。UTF-8編碼的使用範圍比較普遍,客戶端與服務器之間傳輸的數據大多以UTF-8編碼。 服務器
關於UTF-8的詳細說明能夠Wiki下:UTF-8。 app
下圖是UTF-8編碼的格式: 編碼
開發的流程大概是: spa
- 將NSString字符串轉成UTF-8格式的char串。
- 從頭依次讀取char串中的字節。
- 根據上圖中的'Byte 1'字段,判斷當前字符佔幾個字節,並獲取這幾個字節。
- 將獲取的幾個字節轉成NSString字符串對象。
- 獲取下一個字符,進行3,只到獲取最後的字符。
**有一點要注意: .net
1 |
NSString *string = [NSString stringWithFormat:@"1a張"]; |
2 |
const char *chars = [string cStringUsingEncoding:NSUTF8StringEncoding]; |
3 |
for (int i = 0; i < strlen(chars); i++) { |
4 |
printf("%x", chars[i]); |
輸出:3161ffffffe5ffffffbcffffffa0 orm
在iOS中,非ASCII字符的前面都會加上ffffff,而不是直接使用UTF-8中規定的起始值。 對象
下面是代碼實現(使用類別): blog
NSString+StringToWords.h ip
1 |
#import <Foundation/Foundation.h> |
NSString+StringToWords.h 內存
01 |
#import "NSString+StringToWords.h" |
03 |
@implementation NSString (StringToWords) |
07 |
#if ! __has_feature(objc_arc) |
08 |
NSMutableArray *words = [[[NSMutableArray alloc] init] autorelease]; |
10 |
NSMutableArray *words = [[NSMutableArray alloc] init]; |
13 |
const char *str = [self cStringUsingEncoding:NSUTF8StringEncoding]; |
16 |
for (int i = 0; i < strlen(str);) { |
18 |
if (str[i] >= 0xFFFFFFFC) { |
20 |
} else if (str[i] >= 0xFFFFFFF8) { |
22 |
} else if (str[i] >= 0xFFFFFFF0) { |
24 |
} else if (str[i] >= 0xFFFFFFE0) { |
26 |
} else if (str[i] >= 0xFFFFFFC0) { |
28 |
} else if (str[i] >= 0x00) { |
32 |
word = malloc(sizeof(char) * (len + 1)); |
33 |
for (int j = 0; j < len; j++) { |
39 |
NSString *oneWord = [NSString stringWithCString:word encoding:NSUTF8StringEncoding]; |
41 |
[words addObject:oneWord]; |