iOS 获取字符串中的单个字符

iOS 获取字符串中的单个字符

要取到单个字符,就要知道字符串的编码方式,这样才能够定位每个字符在内存中的位置。但是,iOS的字符串编码是不固定的,因此,需要设置一个统一的编码格式,将所有其他格式的字符串都转化为统一的格式,然后就可以根据编码规则取到单个字符了。在这里,使用UTF-8编码。UTF-8编码的使用范围比较广泛,客户端与服务器之间传输的数据大多以UTF-8编码。

关于UTF-8的详细说明可以Wiki下:UTF-8

下图是UTF-8编码的格式:

175942_7lOM_577690.png

开发的流程大概是:

  1. 将NSString字符串转成UTF-8格式的char串。
  2. 从头依次读取char串中的字节。
  3. 根据上图中的'Byte 1'字段,判断当前字符占几个字节,并获取这几个字节。
  4. 将获取的几个字节转成NSString字符串对象。
  5. 获取下一个字符,进行3,只到获取最后的字符。

**有一点要注意:

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]);
5 }

输出:3161ffffffe5ffffffbcffffffa0

在iOS中,非ASCII字符的前面都会加上ffffff,而不是直接使用UTF-8中规定的起始值。

下面是代码实现(使用类别):

NSString+StringToWords.h

1 #import <Foundation/Foundation.h>
2  
3 @interface NSString (StringToWords)
4  
5 - (NSArray *)words;
6  
7 @end

NSString+StringToWords.h

01 #import "NSString+StringToWords.h"
02  
03 @implementation NSString (StringToWords)
04  
05 - (NSArray *)words
06 {
07 #if ! __has_feature(objc_arc)
08     NSMutableArray *words = [[[NSMutableArray alloc] init] autorelease];
09 #else
10     NSMutableArray *words = [[NSMutableArray alloc] init];
11 #endif
12  
13     const char *str = [self cStringUsingEncoding:NSUTF8StringEncoding];
14  
15     char *word;
16     for (int i = 0; i < strlen(str);) {
17         int len = 0;
18         if (str[i] >= 0xFFFFFFFC) {
19             len = 6;
20         } else if (str[i] >= 0xFFFFFFF8) {
21             len = 5;
22         } else if (str[i] >= 0xFFFFFFF0) {
23             len = 4;
24         } else if (str[i] >= 0xFFFFFFE0) {
25             len = 3;
26         } else if (str[i] >= 0xFFFFFFC0) {
27             len = 2;
28         } else if (str[i] >= 0x00) {
29             len = 1;
30         }
31  
32         word = malloc(sizeof(char) * (len + 1));
33         for (int j = 0; j < len; j++) {
34             word[j] = str[j + i];
35         }
36         word[len] = '\0';
37         i = i + len;
38  
39         NSString *oneWord = [NSString stringWithCString:word encoding:NSUTF8StringEncoding];
40         free(word);
41         [words addObject:oneWord];
42     }
43  
44     return words;
45 }
46  
47 @end

转载于:https://my.oschina.net/u/1242760/blog/149630

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值