如何从NSString中获取单个字符?

74

我希望从NSString的某个位置获取一个字符,并且要求结果为NSString类型。

以下是我用来获取索引为it处单个字符的代码:

[[s substringToIndex:i] substringToIndex:1]

有更好的方法吗?


1
你想要获取字符还是删除它?或者是获取并删除它? - Kris Markel
1
我只想得到这个字符。 - node ninja
4个回答

134

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

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

8
请查看“无特定人”的下面回答。我的解决方案对于许多Unicode字符将返回垃圾结果。 - Kris Markel
2
答案并没有完全说明问题。当你处理表情符号、肤色、变音标记和CJK字符时,NSString就会变得棘手起来。https://www.objc.io/issues/9-strings/unicode/揭示了更多关于奇怪的NSString的细节。 - Yang.Y

41

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

- (unichar)characterAtIndex:(NSUInteger)index;

使用方法如下:

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

23

你的建议只适用于像ASCII这样简单的字符。NSString存储Unicode,如果你的字符由多个unichar组成,那么最终可能会得到乱码。使用

- (NSRange)rangeOfComposedCharacterSequenceAtIndex:(NSUInteger)index;

如果您想确定字符有多少个unichars。 我使用此方法遍历我的字符串以确定字符边界的位置。

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


该方法的文档页面包含一个有用的代码片段,可将任何范围调整为以Unicode边界开始和停止。http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/Reference/NSString.html - JeremyP
“无特定人士”的关注是有道理的,但这里提供的信息是不准确和令人困惑的。NSStrings是建立在UTF-16单元之上的,这是一种2字节编码方案,字符串的长度、索引和范围都用这种单元表示。单个UTF-16单元涵盖了现代语言中绝大多数字符,包括东亚语言,并且比ASCII大得多。确实有一些代码点必须表示为一对UTF-16单元(组合字符),例如某些古代语言的字符或带有重音符号的某些字符。处理这些字符时,NOIP的建议确实有所帮助。 - CodeBrew
UTF-16 能够涵盖所有的中文字符吗? - Awesome-o

0
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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接