2009-11-17 6 views
1

Je comparais Une chaîne venant de XML avec une autre chaîne et les résultats montraient qu'ils ne sont pas égaux. mais dans NSLog(), les deux étaient identiques (par exemple, Valore Books).iphone comparer   avec NSString

puis j'ai vérifié la source du XML et j'ai appris que la chaîne actuelle est "Valore & # 160; Books" et & # 160; est en fait un espace. mais le problème est celui-ci quand je le compare avec @ "Valore Books", il est dit que les deux ne sont pas les mêmes.

Que faire?

+0

Quel analyseur utilisez-vous? – Morion

Répondre

0

J'ai résolu le problème en utilisant un utilitaire d'analyse de chaîne fourni par google. Merci à tous.

2

Note: Je remplace ma réponse originale par celle qui est réellement correcte pour ce problème. Désolé pour le malentendu initial.

La ligne suivante désapplique les entités html de votre chaîne.

NSString *A = @"Valore Books"; 
NSString *B = (NSString *)CFXMLCreateStringByUnescapingEntities(NULL, (CFStringRef)A, NULL); 

Je n'ai trouvé aucune fonction équivalente de niveau supérieur, mais les performances devraient être excellentes. Si je lis correctement les docs, vous pouvez passer un CFDictionaryRef comme troisième argument pour spécifier des conversions supplémentaires, mais il semble que cela fasse du bon travail en faisant des standards par lui-même.

Les documents sont here. Notez que c'est probablement une bonne idée de gérer l'encodage quel que soit l'endroit où vous insérez ces chaînes dans votre programme, et pas à chaque fois que vous comparez.

Vous trouverez également une deuxième partie de ce que vous devez prendre en compte. & # 160 n'est pas seulement un espace, c'est un espace non-cassant, que le code ci-dessus convertit en \ 312 au lieu de l'espace standard. Ce sont en fait des caractères séparés dans l'encodage et quand vous faites une comparaison de chaîne, cela échouera.

Peut-être que ce serait plus facile de remplacer # 160 # 32 avec l'aide

- (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement 

et en cours d'exécution, puis à travers le unescape.

Il me vient aussi à l'esprit que le CFXMLCreateStringByUnescapingEntities ne sera pas disponible sur l'iPhone. Here is a link à un exemple qui montre comment faire des conversions similaires sur l'iPhone.

+0

' ' n'est pas un pourcentage d'encodage mais une entité HTML. Donc, cette méthode ne va pas aider ici. –

+0

Assez juste, bien que les recherches google semblent indiquer qu'il le ferait, mais je ne l'ai pas testé. Je vais essayer quand je serai dans mon bureau. –

0

& # 160; est un espace insécable (valeur Unicode U + 00A0) L'espace régulier est (dans @ "Livres Valore") a la valeur Unicode U + 0020. Ce n'est donc pas le même caractère, et les deux chaînes ne sont pas égales.