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

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

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

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

开发的流程大概是:

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

**有一点要注意:

?


1

2

3

4

5

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.h

?


1

2

3

4

5

6

7

#import <Foundation/Foundation.h>

@interface NSString (StringToWords)

- (NSArray *)words;

@end

NSString+StringToWords.h

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

#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

http://my.oschina.net/yongbin45/blog/149549

时间: 2024-11-01 21:51:35

iOS 获取字符串中的单个字符的相关文章

css和jQuery ,字符串中重新单个字符样式背景

<table class="tb2"> <tr><td class="td1">融资登记企业<span>985</span>个</td><td class="td2">融资项目数量<span>985</span>个</td><td class="td3">融资需求金额<span>985

iOS 获取字符串中的所有数字

NSString * str = @"123/21年123" NSCharacterSet *nonDigitCharacterSet = [[NSCharacterSet decimalDigitCharacterSet] invertedSet]; //获取字符串中的数字 str = [[str componentsSeparatedByCharactersInSet:nonDigitCharacterSet] componentsJoinedByString:@"&qu

【SQL Server 学习系列】-- 获取字符串中出现某字符的次数及字符某次出现的下标

DECLARE @Str NVARCHAR(500) = '1_BB_CC_DD_AA_EE_YY_WW_HH_GG' --// 1. 获取下划线在字符串中出现的次数 SELECT LEN(@Str) - LEN(REPLACE(@Str, '_', '')) --// 2. 获取下划线某次出现的位置下标 IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[IndexNumOfStr]') AND t

js使用正则表达式获取字符串中特定的字符

需求:从124fddr323532${xxxasdsafxx}253${bnm}23354${abcd}233545xx54${666}233545xxxxx这类字符串中获取${}中的内容.注意${xxx}的个数是不确定的. 使用了match和exec两种方式实现,直接上代码(更推荐第二种): function getMatchedStrs (str) { var reg = /\$\{(.+?)\}/ var reg_g = /\$\{(.+?)\}/g var result = str.ma

C#经典笔试题-获取字符串中相同的字符以及其个数

本文来自:http://www.cnblogs.com/kejie/p/5971773.html public Dictionary<char,int> GetStrSameAs(string str){ //将字符串转换成一个字符数组. char[] charArray=str.ToCharArray(); //定义一个字典用,其中的键key作为取出的字符,值value作为对应字符的个数. Dictionary<char,int> dic=new Dictionary<ch

ios 开发中获取字符串中重复的字符的rang

iOS 开发中经常会遇到处理字符串的问题,对于一个字符串经常会遇见里面包含重复的字符需要对重复的字符进行处理,下面的代码就是对重复字符进行处理的操作,具体代码如下所示: /** * 返回重复字符的location * * @param text 初始化的字符串 * @param findText 查找的字符 * * @return 返回重复字符的location */ - (NSMutableArray *)getRangeStr:(NSString *)text findText:(NSStr

iPhone开发--正则表达式获取字符串中的内容

缘起: 想获取字符串中指定的字符,考虑用正则表达式,遂写了如下的代码: [cpp] view plaincopy NSString *htmlStr = @"oauth_token=1a1de4ed4fca40599c5e5cfe0f4fba97&oauth_token_secret=3118a84ad910967990ba50f5649632fa&name=foolshit"; NSString *regexString = @"oauth_token=(\

几个小编程题(数组去重,获取字符串中最多字符)

1.编写一个方法去掉一个数组的重复元素: 方法一:普通for循环嵌套: 1 function removeSame(arr){ 2 console.log(arr); 3 for(var i=0, len = arr.length; i<len; i++){ 4 for(var j=i+1; j<len-i; j++){ 5 if(arr[i] === arr[j]){ 6 arr.splice(arr[j], 1); //如果检测到有重复的元素则删除 7 j--; //当有多个重复元素时向前

获取多个字符串中的共同字符

John 发现了很多种岩石.每种岩石都有一个独一无二成分:由小写英文字母组成.宝石是由一个单一的字符组成,并且将在所有岩石中出现.给出一些岩石的成分,输出有多少种不同的宝石存在. 输入: 第一行包含一个整数 N, 代表岩石的个数接下来的N行,每行包含岩石的构成,由小写的英文字母组成 输出: 输出有多少种不同的宝石 数据范围1 ≤ N ≤ 1001 ≤ 代表岩石组成的英文单词长度 ≤ 100 样例输入3abcddebaccdeeabg样例输出2样例解释只有"a", "b&quo