web-dev-qa-db-fra.com

iOS: Comment faire un bon encodage d'URL?

Je ne parviens pas à ouvrir une URL dans UIWebView. J'ai donc recherché et découvert que je devais coder une URL. J'ai donc essayé de la coder, mais j'ai un problème de codage 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 par stringByReplacingOccuranceOfString:@"" withString:@"", il me donne l'URL que je voulais comme http://somedomain.com/data/Témp Page - Open.html. Cependant, il ne s'ouvre pas dans UIWebView mais, étonnamment, il s'ouvre dans Safari & FireFox perfect. Même si j'ouvre une URL non codée, elle se convertit automatiquement et ouvre la page que je cherche.

J'ai google pour le codage d'URL et il 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 de codage d'URL, mais cela modifiait simplement tous les caractères spéciaux et donnait à mon URL le même nom, http%3A%2F%2Fsomedomain.com%2Fdata%2FT..., qui ne peut pas s'ouvrir dans UIWebView et même dans aucun navigateur.

Il donne le Error Log suivant dans UIWebView delegate

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

Code d'erreur: 101 & Description: Domaine d'erreur = Code WebKitErrorDomain = 101 "L'opération n'a pas pu être terminée. (Erreur WebKitErrorDomain 101.)" UserInfo = 0x6e4cf60 {}

28
Hemang

J'ai fait quelques tests et je pense que le problème ne concerne pas vraiment la UIWebView, mais plutôt que NSURL n'acceptera pas l'URL car é dans "Témp" n'est pas codé correctement. Cela entraînera +[NSURLRequest requestWithURL:] et -[NSURL URLWithString:] à renvoyer nil car la chaîne contient une URL mal formée. Je suppose que vous finissez par utiliser une requête nil avec -[UIViewWeb loadRequest:] qui n’est pas utile.

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 élégante des URL malformées de WebKit et que vous ne voulez pas l'implémenter vous-même, vous pouvez faire quelque chose comme cela, 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];
14
Mattias Wadman

La réponse fournie par @Dhaval Vaishnani n’est que partiellement correcte. Cette méthode considère que les caractères ?, = et & ne doivent pas être codés car ils sont valides dans une URL. Par conséquent, vous ne pouvez pas utiliser cette méthode pour coder une chaîne arbitraire afin de l'utiliser en toute sécurité dans le cadre d'une URL. Au lieu de cela, vous devez utiliser CoreFoundation et CFURLRef:

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

N'oubliez pas de vous débarrasser de la propriété de la chaîne obtenue à l'aide de CFRelease(safeString);.

En outre, il semble que malgré le titre, OP recherche décodage et non encoding une chaîne. 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 de gérer correctement la mémoire.

16
user529758

Le moyen le plus simple consiste à utiliser:

NSString *encodedString = [rawString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

iDhaval était proche, mais il le faisait dans l’inverse (décoder au lieu d’encoder).

La méthode 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://fr.wikipedia.org/wiki/Percent-encoding#Percent-encoding_reserved_characters

J'espère que cela pourra aider.

13
jclv

C'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 cela fonctionne parfaitement avec moi.

J'espère que ça vous aidera !!!

6
iDhaval

Cela peut être utile à quelqu'un qui a accès à cette question pour le codage d'URL, car ma question est probablement différente ce qui a été résolu et accepté , c'est la façon dont j'avais l'habitude de coder,

-(NSString *)encodeURL:(NSString *)urlString
{
    CFStringRef newString = CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)urlString, NULL, CFSTR("!*'();:@&=+@,/?#[]"), kCFStringEncodingUTF8);
    return (NSString *)CFBridgingRelease(newString);
}
4
Hemang

Tu peux essayer ça

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

NSString* encodedUrl = [url stringByAddingPercentEscapesUsingEncoding:
 NSASCIIStringEncoding];
3
nithinreddy

Je pense que cela fonctionnera pour vous

[strUrl stringByAddingPercentEncodingWithAllowedCharacters:NSCharacterSet.URLQueryAllowedCharacterSet]

la méthode native pour l'encodage d'URL.

2
Mrug

Vous devrez probablement décomposer l'URL en ses parties constituantes, puis l'URL encodera l'hôte et le chemin, mais pas le schéma. Puis remettez-le ensemble à nouveau. 

Créez un NSURL avec la chaîne, puis utilisez les méthodes telles que hôte, schéma, chemin, requête, etc. pour le séparer. Utilisez ensuite CFURLCreateStringByAddingPercentEscapes pour coder les pièces, puis vous pouvez les réassembler dans une nouvelle NSURL.

0
Michael

Swift 4.x

let originalString = "https://www.somedomain.com/folder/some cool file.jpg"
let escapedString = originalString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
print(escapedString!)
0
Hemang