Question

Dans une application que je suis en train d'écrire j'ai un code comme ceci:

NSWorkspace* ws = [NSWorkspace sharedWorkspace];
NSString* myurl = @"http://www.somewebsite.com/method?a=%d";

NSURL* url = [NSURL URLWithString:myurl];

[ws openURL:url];

La principale différence étant qu' myurl vient de quelque part, en dehors de mon contrôle.Remarque %d dans l'URL, ce qui n'est pas tout à fait correct et signifie que URLWithString échoue, le retour nul.

Qu'est-ce que la "bonne" façon de ce traitement?Ai-je besoin pour analyser la chaîne et coder correctement les arguments?Ou est-il une méthode intelligente dans le Cacao qui fait tout le travail dur pour moi?

Était-ce utile?

La solution

Je ne sais pas si c'est exactement ce que vous cherchez, mais il existe une méthode en NSString qui va désinfecter l'URL:

stringByAddingPercentEscapesUsingencoding:

Autres conseils

Je pense que le comportement ici est correcte, parce que %d n'est pas un composant valide d'une URL (en% est la fuite, mais attend deux caractères hexadécimaux à suivre).

Vous ne pouvez pas encoder l'URL donnée à vous, parce que ce serait de coder l' /s et ?s ainsi, que vous ne voulez pas.

La question est donc, quel est le comportement correct ici?

Peut-être que vous souhaitez qu'il soit transformé en...

http://www.somewebsite.com/method?a=%25d

(c'est à direle % est de coder à la version encodée de % dans une URL, de sorte que lorsque la méthode obtient de l'entrée, il voit comme étant à %d)

Je ne pense pas qu'il y a une bibliothèque qui permet de faire ce genre de chose pour vous, car il n'y a pas de "bonne" façon de le faire.À propos, il n'est correcte chose que vous pouvez faire est de retourner un message d'erreur indiquant l'URL qui vous est donné n'est pas valide (comme URLWithString est)


Si vous voulais essayer de gérer l'entrée, je suppose que vous devez rechercher l'URL d'un % symboles qui ne sont pas immédiatement suivi de deux caractères hexadécimaux, puis de remplacer le % à %à 25 dans ce cas.Cela devrait être tout à fait possible avec une expression régulière, bien que je soupçonne il peut y avoir certaines des complexités supplémentaires si votre Url de démarrage contenant des versions codées de caractères en dehors du jeu de caractères ASCII.

Malheureusement, vous avez besoin d'être plus intelligent que ce qui est fourni par Apple :

stringByAddingPercentEscapesUsingEncoding:

Cela permettra d'échapper à toutes les URL non valide caractères de sorte que "http://foo.com/hey%20dude/", qui est valide, devient "http://foo.com/hey%2520dud/", ce qui n'est pas ce que nous voulons.

Selon la documentation d'apple : http://developer.apple.com/library/mac/documentation/CoreFOundation/Reference/CFURLRef/Reference/reference.html#//apple_ref/c/func/CFURLCreateStringByAddingPercentEscapes

J'ai fait un NSURL catégorie qui fait la bonne chose et travaille avec odd chaîne comme ceux ayant partielle de l'encodage (c'est à dire"http://foo.com/hey dude/i%20do%20tl/").

Voici le code:

@interface NSURL (SmartEncoding)
+ (NSURL *)smartURLWithString:(NSString *)str;
@end

@implementation NSURL (SmartEncoding)

+ (NSURL *)smartURLWithString:(NSString *)str
{
    CFStringRef preprocessed = CFURLCreateStringByReplacingPercentEscapesUsingEncoding(NULL, (CFStringRef)str, CFSTR(""), kCFStringEncodingUTF8);
    if (!preprocessed) 
        preprocessed = CFURLCreateStringByReplacingPercentEscapesUsingEncoding(NULL, (CFStringRef)str, CFSTR(""), kCFStringEncodingASCII);

    if (!preprocessed)
        return [NSURL URLWithString:str];

    CFStringRef sanitized = CFURLCreateStringByAddingPercentEscapes(NULL, preprocessed, NULL, NULL, kCFStringEncodingUTF8);
    CFRelease(preprocessed);
    NSURL *result = (NSURL*)CFURLCreateWithString(NULL, sanitized, NULL);
    CFRelease(sanitized);
    return [result autorelease];
}

@end

Il fonctionne très bien avec chaîne UTF8 codé en ASCII et ceux.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top