iOS 獲取字符串中的單個字符

#iOS 獲取字符串中的單個字符服務器

要取到單個字符,就要知道字符串的編碼方式,這樣纔可以定位每一個字符在內存中的位置。可是,iOS的字符串編碼是不固定的,所以,須要設置一個統一的編碼格式,將全部其餘格式的字符串都轉化爲統一的格式,而後就能夠根據編碼規則取到單個字符了。在這裏,使用UTF-8編碼。UTF-8編碼的使用範圍比較普遍,客戶端與服務器之間傳輸的數據大多以UTF-8編碼。編碼

關於UTF-8的詳細說明能夠Wiki下:UTF-8code

下圖是UTF-8編碼的格式:orm

UTF-8編碼

開發的流程大概是:對象

  1. 將NSString字符串轉成UTF-8格式的char串。
  2. 從頭依次讀取char串中的字節。
  3. 根據上圖中的'Byte 1'字段,判斷當前字符佔幾個字節,並獲取這幾個字節。
  4. 將獲取的幾個字節轉成NSString字符串對象。
  5. 獲取下一個字符,進行3,只到獲取最後的字符。

**有一點要注意: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
相關文章
相關標籤/搜索