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 {}
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];
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.
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.
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!!!
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);
}
Vous pouvez essayer ceci
NSString *url = @"http://www.abc.com/param=Hi how are you";
NSString* encodedUrl = [url stringByAddingPercentEscapesUsingEncoding:
NSASCIIStringEncoding];
Je pense que cela fonctionnera pour vous
[strUrl stringByAddingPercentEncodingWithAllowedCharacters:NSCharacterSet.URLQueryAllowedCharacterSet]
La méthode Native pour L'encodage D'URL.
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.
Swift 4.x
let originalString = "https://www.somedomain.com/folder/some cool file.jpg"
let escapedString = originalString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
print(escapedString!)
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.