【问题标题】:How to get a single NSString character from an NSString如何从 NSString 中获取单个 NSString 字符
【发布时间】:2011-04-19 16:43:45
【问题描述】:

我想从 NSString 中的某个地方获取一个字符。我希望结果是一个 NSString。

这是我用来在索引处获取单个字符的代码:

[[s substringToIndex:i] substringToIndex:1]

有没有更好的方法?

【问题讨论】:

  • 您要检索字符还是删除它?或者检索并删除它?
  • 我只想得到角色。

标签: objective-c cocoa-touch nsstring


【解决方案1】:

这还将检索索引 i 处的字符作为 NSString,并且您只使用 NSRange 结构而不是额外的 NSString。

NSString * newString = [s substringWithRange:NSMakeRange(i, 1)];

【讨论】:

  • 请务必查看下面没有人特别给出的答案。我的解决方案将为大量 unicode 字符返回垃圾。
  • 答案并不能说明全部情况。当您处理表情符号、肤色、变音符号和 CJK 字符时,NSString 变得很棘手。 objc.io/issues/9-strings/unicode 揭示了奇怪的 NSString 的更多细节。
【解决方案2】:

如果你只想从一个 NSString 中获取一个字符,你可以试试这个。

- (unichar)characterAtIndex:(NSUInteger)index;

这样使用:

NSString *originalString = @"hello";
int index = 2;
NSString *theCharacter = [NSString stringWithFormat:@"%c", [originalString characterAtIndex:index-1]];
//returns "e".

【讨论】:

    【解决方案3】:

    您的建议仅适用于 ASCII 等简单字符。 NSStrings 存储 unicode,如果您的角色有几个 unichars 长,那么您最终可能会出现乱码。使用

    - (NSRange)rangeOfComposedCharacterSequenceAtIndex:(NSUInteger)index;
    

    如果你想确定你的角色有多少个 unichars。我使用它来逐步遍历我的字符串以确定字符边界出现的位置。

    完全支持 unicode 需要一些工作,但取决于您使用的语言。我看到很多亚洲文字,所以大多数字符从一个空格溢出,所以这是我需要做的工作。

    【讨论】:

    • 此方法的文档页面有一个有用的代码片段来调整任何范围以在 Unicode 边界处开始和停止。 developer.apple.com/library/ios/#documentation/Cocoa/Reference/…
    • “没有人特别关注”的担忧是有效的,但此处提供的信息不准确且令人困惑。 NSStrings 是建立在 UTF-16 单位、2 字节编码方案的基础上的,字符串的长度、索引和范围都用这种单位表示。单个 UTF-16 单元涵盖了现代语言中的绝大多数字符,包括东亚语言,并且比 ASCII 大得多。确实有代码点必须表示为一对 UTF-16 单元(组合字符),例如来自某些古代语言的字符,或某些带有重音符号的字符。在处理这些问题时,NOIP 的建议确实有帮助。
    • UTF-16 是否覆盖所有汉字?
    【解决方案4】:
    NSMutableString *myString=[NSMutableString stringWithFormat:@"Malayalam"];
    NSMutableString *revString=@"";
    
    for (int i=0; i<myString.length; i++) {
        revString=[NSMutableString stringWithFormat:@"%c%@",[myString characterAtIndex:i],revString];
    }
    NSLog(@"%@",revString);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-06
      • 1970-01-01
      相关资源
      最近更新 更多