So erhalten Sie einen einzelnen NSString-Charakter von einem NSString

70

Ich möchte einen Charakter von irgendwo in einem NSString bekommen. Ich möchte, dass das Ergebnis ein NSString ist.

Dies ist der Code, den ich verwende, um ein einzelnes Zeichen beim Indexieren zu erhalten:

[[s substringToIndex:i] substringToIndex:1]

Gibt es einen besseren Weg, dies zu tun?

Knoten Ninja
quelle
1
Möchten Sie den Charakter abrufen oder entfernen? Oder abrufen und entfernen?
Kris Markel
Ich möchte nur den Charakter bekommen.
Knoten Ninja

Antworten:

132

Dadurch wird auch ein Zeichen am Index i als NSString abgerufen, und Sie verwenden nur eine NSRange-Struktur anstelle eines zusätzlichen NSString.

NSString * newString = [s substringWithRange:NSMakeRange(i, 1)];
Kris Markel
quelle
8
Schauen Sie sich unbedingt die Antwort von niemandem unten an. Meine Lösung gibt Müll für eine große Anzahl von Unicode-Zeichen zurück.
Kris Markel
2
Die Antwort erzählt nicht die ganze Geschichte. NSString wird schwierig, wenn Sie mit Emoji, Hauttönen, diakritischen Zeichen und CJK-Zeichen umgehen. objc.io/issues/9-strings/unicode enthüllt weitere Details von seltsamem NSString.
Yang.Y
39

Wenn Sie nur einen Charakter von einem NSString erhalten möchten, können Sie dies versuchen.

- (unichar)characterAtIndex:(NSUInteger)index;

So verwendet:

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

Ihr Vorschlag funktioniert nur für einfache Zeichen wie ASCII. NSStrings speichern Unicode und wenn Ihr Charakter mehrere Unichars lang ist, könnten Sie Kauderwelsch bekommen. Verwenden

- (NSRange)rangeOfComposedCharacterSequenceAtIndex:(NSUInteger)index;

wenn du bestimmen willst, wie viele Unichars dein Charakter ist. Ich benutze dies, um meine Zeichenfolgen zu durchlaufen und festzustellen, wo die Zeichenränder auftreten.

Die vollständige Unicode-Fähigkeit ist ein wenig Arbeit, hängt jedoch davon ab, welche Sprachen Sie verwenden. Ich sehe viel asiatischen Text, so dass die meisten Zeichen aus einem Raum übergehen und es Arbeit ist, die ich tun muss.

Niemand Bestimmtes
quelle
Die Dokumentationsseite für diese Methode enthält ein nützliches Codefragment zum Anpassen eines beliebigen Bereichs zum Starten und Stoppen an den Unicode-Grenzen. developer.apple.com/library/ios/#documentation/Cocoa/Reference/…
JeremyP
Das Anliegen von "Niemand im Besonderen" ist gültig, aber die hier gegebenen Informationen sind ungenau und verwirrend. NSStrings basieren auf UTF-16-Einheiten, einem 2-Byte-Codierungsschema, und die Länge, der Index und der Bereich der Zeichenfolge werden in solchen Einheiten ausgedrückt. Einzelne UTF-16-Einheiten decken die überwiegende Mehrheit der Zeichen in modernen Sprachen ab, einschließlich Ostasien, und sind viel größer als ASCII. Es gibt tatsächlich Codepunkte, die als Paar von UTF-16-Einheiten (zusammengesetzte Zeichen) dargestellt werden müssen, z. B. Zeichen aus einigen alten Sprachen oder bestimmte Zeichen mit Akzentzeichen. Im Umgang mit diesen hilft der Rat von NOIP.
CodeBrew
Deckt UTF-16 alle chinesischen Schriftzeichen ab?
Super-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);
Neeraj Jerauld
quelle