2010-10-01 9 views
61

Je souhaite obtenir un caractère à partir d'un NSString. Je veux que le résultat soit un NSString.Comment obtenir un seul caractère NSString à partir d'un NSString

Voici le code que j'utilise pour obtenir un seul caractère à indexer:

[[s substringToIndex:i] substringToIndex:1] 

est-il une meilleure façon de le faire?

+1

Voulez-vous récupérer le caractère, ou le supprimer? Ou récupérer et supprimer? –

+0

Je veux juste obtenir le personnage. –

Répondre

124

Cela récupérera également un caractère à l'index i comme un NSString, et vous utilisez seulement une structure NSRange plutôt qu'un NSString supplémentaire.

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

Soyez sûr de vérifier la réponse de personne en particulier ci-dessous. Ma solution retournera la poubelle pour un grand nombre de caractères Unicode. –

+1

La réponse ne dit pas toute l'histoire. NSString devient difficile lorsque vous traitez avec des emoji, des tons chair, des signes diacritiques et des caractères CJK. https://www.objc.io/issues/9-strings/unicode/ révèle plus de détails de NSString étrange. –

23

Votre suggestion ne fonctionne que pour des caractères simples comme ASCII. NSStrings stocke unicode et si votre personnage a plusieurs longs Unichars, vous pourriez vous retrouver avec du charabia. Utilisez

- (NSRange)rangeOfComposedCharacterSequenceAtIndex:(NSUInteger)index; 

si vous souhaitez déterminer le nombre d'unichars de votre personnage. J'utilise ceci pour parcourir mes chaînes afin de déterminer où les limites de caractères se produisent.

Etre complètement compatible Unicode est un peu de travail mais cela dépend des langues que vous utilisez. Je vois beaucoup de texte asiatique, donc la plupart des personnages débordent d'un espace et c'est donc le travail que je dois faire.

+0

La page de documentation de cette méthode contient un fragment de code utile pour ajuster toute plage de démarrage et d'arrêt aux limites Unicode. http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/Reference/NSString.html – JeremyP

+0

La préoccupation de "personne en particulier" est valide mais les informations fournies ici sont inexactes et déroutant. Les chaînes NSS sont construites sur des unités UTF-16, un schéma de codage sur 2 octets, et la longueur, l'indice et la portée des chaînes sont exprimés dans ces unités. Les unités UTF-16 simples couvrent la grande majorité des caractères dans les langues modernes, y compris l'Asie de l'Est, et sont beaucoup plus grandes que l'ASCII. Il y a en effet des points de code qui doivent être représentés comme une paire d'unités UTF-16 (caractères composés), tels que des caractères de certaines langues anciennes, ou certains caractères avec des accents. Lorsque vous traitez avec ceux-ci, le conseil de NOIP aide. – CodePlumber

+0

Est-ce que UTF-16 couvre tous les caractères chinois? –

32

Si vous voulez juste obtenir un caractère d'un NSString, vous pouvez essayer ceci.

- (unichar)characterAtIndex:(NSUInteger)index; 

Utilisé comme ceci:

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

C'est exactement ce dont j'avais besoin, merci – Pavan

0
NSMutableString *myString=[NSMutableString stringWithFormat:@"Malayalam"]; 
NSMutableString *[email protected]""; 

for (int i=0; i<myString.length; i++) { 
    revString=[NSMutableString stringWithFormat:@"%c%@",[myString characterAtIndex:i],revString]; 
} 
NSLog(@"%@",revString); 
Questions connexes