zoukankan      html  css  js  c++  java
  • iOS 获取字符串中的单个字符

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

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

    下图是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] = '';
            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

  • 相关阅读:
    如何复用网页
    sap
    学习方法
    spring + ehcache 实例
    200个 jquery插件
    vs 示例代码浏览器 搜索
    struts jquery 整合
    eclipse clean 后clease 为空
    mvc相关
    css 框架
  • 原文地址:https://www.cnblogs.com/yangmx/p/4157460.html
Copyright © 2011-2022 走看看