J'essaie de comparer l'égalité de deux chaînes multilignes. Je reçois une des chaînes d'un service web, et l'autre que je reçois d'iTunes via le Scripting Bridge. Les chaînes du service Web sont finalement transférées sur iTunes, donc si je fais cela et que je compare ensuite les chaînes, idéalement, elles seraient identiques. Toutefois, lorsque vous comparez des chaînes de ce type, il semble que isEqualToString: renvoie toujours la non-égalité. Je suis en train de tester cela en testant l'égalité d'une chaîne d'iTunes provenant du service Web, et une chaîne directement à partir du service Web. La consignation des deux chaînes dans la console génère une sortie des deux chaînes qui semble identique. L'enregistrement des longueurs des cordes produit des longueurs identiques.isEqualToString de NSString: semble signaler par erreur la non-égalité
J'ai également essayé de comparer les chaînes en utilisant d'autres méthodes. Par exemple, je les ai converties en chaînes ASCII pour vous assurer qu'il n'était pas un problème Unicode:
NSData *iTunesStringData = [[self iTunesString] dataUsingEncoding:NSASCIIStringEncoding
allowLossyConversion:YES];
NSData *webServiceStringData = [[self webServiceString] dataUsingEncoding:NSASCIIStringEncoding
allowLossyConversion:YES];
NSString *newiTunesString = [[[NSString alloc] initWithData:iTunesStringData encoding:NSASCIIStringEncoding] autorelease];
NSString *newWebServiceString = [[[NSString alloc] initWithData:webServiceStringData encoding:NSASCIIStringEncoding] autorelease];
BOOL result = [newiTunesString isEqualToString:newWebServiceString];
Même problème, pas égal. J'ai essayé la comparaison du premier caractère:
NSComparisonResult result = [newiTunesString compare:newWebServiceString
options:NSLiteralSearch
range:NSMakeRange(0,1)
locale:[NSLocale currentLocale]];
ne renvoie pas NSOrderedSame. J'ai connecté ces premiers caractères à la console et ils semblent identiques. J'ai également considéré les différences dans les retours chariot, et j'ai essayé de remplacer @ "\ r" par @ "" dans les deux chaînes avant de comparer, ce qui ne fonctionne pas (et cela ne devrait pas affecter l'égalité du premier caractère). Je ne veux pas supprimer les caractères @ "\ n" car je souhaite conserver les lignes multiples.
Que se passe-t-il? D'autres idées?
Avez-vous essayé d'extraire des tampons unichar de chaque corde et de les parcourir en parallèle pour savoir où ils diffèrent? –
Vous pouvez également utiliser l'une des méthodes '-precomposedStringWithCanonicalMapping' ou' -precomposedStringWithCompatibilityMapping' et voir si cela fait une différence. –
Que se passe-t-il si vous écrivez 'dataUsingEncoding:' UTF-8 (ou ASCII) dans un fichier et que vous les différez, ou que vous les expulsez en hexadécimal et que vous différez les hex-dumps? –