2009-08-31 8 views
21

Ich habe diese versuchtAnzahl der Zeichen in NSString oder NSMutableString?

NSCharacterSet *myCharSet = [NSCharacterSet characterSetWithCharactersInString: myString]; 
[myCharSet count]; 

Aber eine Warnung erhalten, die NSCharacterSet zählen kann nicht antworten. Dies ist für Desktop-Apps und nicht für iPhone, von denen ich denke, dass der obige Code funktioniert.

+0

Zur Klarstellung: Sie möchten die Anzahl der eindeutigen Zeichen in der Zeichenfolge? –

+0

Nein - nur die Gesamtzahl der Zeichen. – 4thSpace

Antwort

76

Ich könnte hier etwas fehlt, aber was mit einfach tun, falsch ist:

NSUInteger characterCount = [myString length]; 

nur in einer Zeichenfolge die Anzahl der Zeichen zu erhalten, ich sehe keinen Grund, herum zu verwirren mit NSCharacterSet.

+14

Nur um klar zu sein - "Länge" gibt die Anzahl der Unicode-Zeichen im Empfänger zurück (wie in der 'NSString'-Dokumentation definiert). Technisch ist die Dokumentation falsch, weil sie tatsächlich die Anzahl der UTF-16-Code-Einheiten und nicht die Anzahl der Unicode-Zeichen zurückgibt. Diese Unterscheidung ist für die überwiegende Mehrheit der Programmierer und Anwendungen unwichtig, hat aber wichtige Konsequenzen. Zum Beispiel gibt '[@ "\ U0010ffff" length] '' '' zurück, obwohl es ein einzelnes Unicode-Zeichen enthält. 'characterAtIndex:' für '0' und' 1' gibt '0xdbff' bzw.' 0xdfff' zurück. – johne

+8

^Das ist UNGLAUBLICH wichtig, denn jetzt schreiben die meisten iOS-Benutzer mit Emojis, die mit der oben erwähnten 'length'-Methode als 2 Zeichen betrachtet werden, obwohl es ein Zeichen ist. –

+0

Dies könnte wichtiger sein, als Sie erwarten würden, wenn Sie CoreData verwenden, das Aufbrechen von Ersatzpaaren wie "" würde die Validierungsregel von CoreData während der Festschreibungsphase nicht passieren, CoreData zeigt Ihnen sanft den Fehlercode von 1671, was sogar Google nicht tut Ich weiß nichts darüber, was mich ein halbes Jahr gekostet hat, um herauszufinden, was wirklich los ist :( – peak

0

Das sollte auch nicht auf dem iPhone funktionieren, da NSCharacterSet auf keiner Plattform eine Unterklasse von NSSet ist.

Wenn Sie wirklich zählen müssen, warum nicht Unterklasse NSSet, fügen Sie den Wert hinzu, dann haben Sie eine Methode, die das als NSCharacterSet bei Bedarf für die Verwendung in allem, das einen Zeichensatz benötigt zurückgibt?

+0

NSSet ist ein Klassencluster und ist daher nicht leicht (oder praktisch) unterklassifiziert. –

+0

Gibt es keine einfache Technik, um alle Zeichen innerhalb einer Zeichenkette zu zählen? – 4thSpace

+1

Ja, es gibt eine (echte Länge): [myString lengthOfBytesUsingEncoding: NSUTF32StringEncoding]/4; – Stephane

Verwandte Themen