如何从NSString获取单个NSString字符


70

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

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

[[s substringToIndex:i] substringToIndex:1]

有更好的方法吗?


1
您要检索字符还是将其删除?还是检索并删除它?
克里斯·马克尔

我只想得到角色。
节点忍者

Answers:


132

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

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

8
请务必在下面检查“没有人特别回答”。我的解决方案将为大量的unicode字符返回垃圾。
克里斯·马克尔

2
答案并不能说明全部。当您处理表情符号,肤色,变音符号和CJK字符时,NSString变得棘手。objc.io/issues/9-strings/unicode揭示了怪异的NSString的更多细节。
Yang.Y 2015年

39

如果您只想从NSString中获取一个字符,则可以尝试此操作。

- (unichar)characterAtIndex:(NSUInteger)index;

像这样使用:

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

23

您的建议仅适用于ASCII等简单字符。NSStrings存储unicode,如果您的字符是几个unichars,那么您最终可能会胡言乱语。采用

- (NSRange)rangeOfComposedCharacterSequenceAtIndex:(NSUInteger)index;

如果要确定您的角色有多少个单字符。我用它来遍历字符串以确定字符边界出现的位置。

完全具备Unicode能力是一项工作,但取决于您使用的语言。我看到了很多亚洲文字,所以大多数字符都是从一个空格溢出的,所以这是我需要做的工作。


此方法的文档页面上有一个有用的代码片段,可用于调整任何范围以在Unicode边界处开始和停止。 developer.apple.com/library/ios/#documentation/Cocoa/Reference/...
JeremyP

“没有人特别”的关注是有效的,但此处提供的信息不准确且令人困惑。NSString基于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);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.