iOS: Comment faire un bon encodage D'URL?

Je ne peux pas ouvrir une URL dans UIWebView donc j'ai cherché et trouvé que j'avais besoin d'encoder L'URL, donc j'ai essayé de l'encoder mais, j'ai rencontré un problème d'encodage D'URL: mon URL est http://somedomain.com/data/Témp%20Page%20-%20Open.html (ce N'est pas une URL réelle).

Je suis préoccupé par %20 que j'ai essayé de remplacer en utilisant stringByReplacingOccuranceOfString:@"" withString:@"", Il me donne l'URL que je voulais comme http://somedomain.com/data/Témp Page - Open.html mais il ne s'ouvre pas dans {[1] } mais étonnamment il s'ouvre dans Safari & FireFox parfait. Même si j'ouvre une URL non codée elle se convertit automatiquement et ouvre la page que je cherche pour.

J'ai google pour l'encodage D'URL et cela me pointe vers différents résultats que j'ai déjà vérifiés mais aucun résultat ne m'aide!! J'ai essayé différentes réponses de fonctions dans différentes questions D'encodage D'URL, mais il a juste changé tous les caractères spéciaux et fait de mon URL comme, http%3A%2F%2Fsomedomain.com%2Fdata%2FT... qui ne peut pas s'ouvrir dans UIWebView et même dans n'importe quel navigateur.

Il donne ce qui suit Error Log dans UIWebView delegate

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error { }

Code D'Erreur: 101 & Description : Erreur domaine = WebKitErrorDomain Code = 101 " l'opération ne pouvait pas être complété. (Erreur WebKitErrorDomain 101.) "UserInfo=0x6e4cf60 {}

28
demandé sur Raptor 2012-09-29 15:40:47

10 réponses

J'ai fait quelques tests et je pense que le problème n'est pas vraiment avec le UIWebView mais à la place que NSURL n'acceptera pas L'URL à cause de l'é dans "témoin" n'est pas encodé correctement. Cela entraînera +[NSURLRequest requestWithURL:] et -[NSURL URLWithString:] à retourner nil car la chaîne contient une URL malformée. Je suppose que vous finissez par utiliser une requête nil avec -[UIViewWeb loadRequest:] ce qui n'est pas bon.

Exemple:

NSLog(@"URL with é: %@", [NSURL URLWithString:@"http://host/Témp"]);
NSLog(@"URL with encoded é: %@", [NSURL URLWithString:@"http://host/T%C3%A9mp"]);

Sortie:

2012-10-02 12:02:56.366 test[73164:c07] URL with é: (null)
2012-10-02 12:02:56.368 test[73164:c07] URL with encoded é: http://host/T%C3%A9mp

Si vous voulez vraiment emprunter la gestion gracieuse des URL malformées qui WebKit A et ne veut pas l'implémenter vous-même, vous pouvez faire quelque chose comme ça mais c'est très moche:

UIWebView *webView = [[[UIWebView alloc]
                       initWithFrame:self.view.frame]
                      autorelease];

NSString *url = @"http://www.httpdump.com/texis/browserinfo/Témp.html";

[webView loadHTMLString:[NSString stringWithFormat:
                         @"<script>window.location=%@;</script>",
                         [[[NSString alloc]
                           initWithData:[NSJSONSerialization
                                         dataWithJSONObject:url
                                         options:NSJSONReadingAllowFragments
                                         error:NULL]
                           encoding:NSUTF8StringEncoding]
                          autorelease]]
                baseURL:nil];
13
répondu Mattias Wadman 2012-10-03 07:53:37

La réponse fournie par @Dhaval Vaishnani n'est que partiellement correcte. Cette méthode traite l'?, = et & caractères à ne pas encoder, puisqu'ils sont valides dans une URL. Ainsi, pour encoder une chaîne arbitraire à utiliser en toute sécurité dans le cadre d'une URL, vous ne pouvez pas utiliser cette méthode. Au lieu de cela, vous devez revenir à L'utilisation de CoreFoundation et CFURLRef:

NSString *unsafeString = @"this &string= confuses ? the InTeRwEbZ";
CFStringRef safeString = CFURLCreateStringByAddingPercentEscapes (
    NULL,
    (CFStringRef)unsafeString,
    NULL,
    CFSTR("/%&=?$#+-~@<>|\\*,.()[]{}^!"),
    kCFStringEncodingUTF8
);

N'oubliez pas de disposer de la propriété de la chaîne résultante en utilisant CFRelease(safeString);.

Aussi, il semble que malgré le titre, OP est à la recherche de décodage et pas codage une chaîne de caractères. CFURLRef a un autre appel de fonction similaire à utiliser pour cela:

NSString *escapedString = @"%32%65BCDEFGH";
CFStringRef unescapedString = CFURLCreateStringByReplacingPercentEscapesUsingEncoding (
    NULL,
    (CFStringRef)escapedString,
    CFSTR(""),
    kCFStringEncodingUTF8
);

Encore une fois, n'oubliez pas la bonne gestion de la mémoire.

16
répondu 2013-11-05 06:34:06

Le moyen le plus simple est d'utiliser:

NSString *encodedString = [rawString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

IDhaval était proche, mais il le faisait dans l'autre sens (décodage au lieu d'encodage).

La manière D'Anand fonctionnerait, mais vous devrez probablement remplacer plus de caractères que d'espaces et de nouvelles lignes. Voir la référence ici: http://en.wikipedia.org/wiki/Percent-encoding#Percent-encoding_reserved_characters

J'espère que ça aide.

13
répondu jclv 2013-08-13 19:39:20

Il est très simple d'encoder L'URL dans l'iPhone. C'est comme suit

NSString* strURL = @"http://somedomain.com/data/Témp Page - Open.html";

NSURL* url = [NSURL URLWithString:[strURL stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

C'est un moyen idéal pour encoder L'URL, Je l'utilise et ça marche parfaitement avec moi.

Espère que ça va vous aider!!!

6
répondu iDhaval 2012-09-29 11:47:25

Cela peut être utile à quelqu'un qui atteint cette question pour l'encodage D'URL, car ma question est probablement différente qui a été résolue et acceptée , c'est la façon dont je faisais l'encodage,

-(NSString *)encodeURL:(NSString *)urlString
{
    CFStringRef newString = CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)urlString, NULL, CFSTR("!*'();:@&=+@,/?#[]"), kCFStringEncodingUTF8);
    return (NSString *)CFBridgingRelease(newString);
}
4
répondu Hemang 2013-05-06 09:08:00

Vous pouvez essayer ceci

NSString *url = @"http://www.abc.com/param=Hi how are you";

NSString* encodedUrl = [url stringByAddingPercentEscapesUsingEncoding:
 NSASCIIStringEncoding];
3
répondu nithinreddy 2013-12-10 13:20:26

Je pense que cela fonctionnera pour vous

[strUrl stringByAddingPercentEncodingWithAllowedCharacters:NSCharacterSet.URLQueryAllowedCharacterSet]

La méthode Native pour L'encodage D'URL.

2
répondu Mrug 2014-07-19 09:57:53

Vous avez probablement besoin de décomposer l'URL en ses parties constituantes, puis L'URL encode l'hôte et le chemin, mais pas le schéma. Puis le remettre à nouveau ensemble.

Créez un NSURL avec la chaîne, puis utilisez les méthodes telles que host, scheme, path, query, etc. pour le séparer. Ensuite, utilisez CFURLCreateStringByAddingPercentescapes pour encoder les parties, puis vous pouvez les remettre ensemble dans un nouveau NSURL.

0
répondu Michael 2012-10-02 08:15:08

Swift 4.x

let originalString = "https://www.somedomain.com/folder/some cool file.jpg"
let escapedString = originalString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
print(escapedString!)
0
répondu Hemang 2017-11-16 05:01:48

Pouvez-vous essayer ceci.

    //yourURL contains your Encoded URL
    yourURL = [yourURL stringByReplacingOccurrencesOfString:@" " withString:@"%20"];
    yourURL = [yourURL stringByReplacingOccurrencesOfString:@"\n" withString:@""];
    NSLog(@"Keyword:%@ is this",yourURL);

Je ne suis pas sûr, mais j'ai résolu en utilisant ceci dans mon cas. J'espère que cela va résoudre le vôtre.

-1
répondu Anand 2012-10-02 06:17:13