Frage

In einer Anwendung, die ich schreibe, habe ich einen Code wie diesen:

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

NSURL* url = [NSURL URLWithString:myurl];

[ws openURL:url];

Der Hauptunterschied besteht darin myurl kommt von irgendwo außerhalb meiner Kontrolle.Beachten Sie das %d in der URL, das nicht ganz korrekt ist und bedeutet, dass URLWithString fehlschlägt und zurückkehrt Null.

Wie geht man damit „richtig“ um?Muss ich die Zeichenfolge analysieren und die Argumente richtig kodieren?Oder gibt es in Cocoa eine clevere Methode, die mir die ganze harte Arbeit abnimmt?

War es hilfreich?

Lösung

Ich bin mir nicht sicher, ob das genau das ist, wonach Sie suchen, aber es gibt eine Methode in NSString, die eine URL bereinigt:

stringByAddingPercentEscapesUsingEncoding:

Andere Tipps

Ich denke, das Verhalten hier ist korrekt, da %d keine gültige Komponente einer URL ist (% ist das Escape, erwartet aber, dass zwei Hexadezimalzeichen darauf folgen).

Sie können nicht einfach die URL, die Sie erhalten haben, per URL kodieren, da dadurch auch die /s und ?s kodiert würden, was Sie nicht möchten.

Die Frage ist also: Was ist hier das richtige Verhalten?

Vielleicht möchten Sie, dass daraus ...

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

(d. h.% wird in die codierte Version von % in einer URL codiert. Wenn die Methode also die Eingabe erhält, sieht sie, dass a auf %d gesetzt ist.)

Ich glaube nicht, dass es irgendeine Bibliotheksfunktion gibt, die so etwas für Sie erledigt, da es keinen „richtigen“ Weg gibt, dies zu tun.Das einzig Richtige, was Sie tun können, ist, eine Fehlermeldung zurückzugeben, die besagt, dass die von Ihnen angegebene URL ungültig ist (genau wie URLWithString).


Wenn Sie versuchen wollten, die Eingabe zu verarbeiten, müssten Sie vermutlich die URL nach %-Symbolen durchsuchen, denen nicht unmittelbar zwei Hexadezimalzeichen folgen, und dann in diesem Fall % durch %25 ersetzen.Das sollte mit einem regulären Ausdruck durchaus möglich sein, obwohl ich vermute, dass es zu zusätzlichen Komplexitäten kommen kann, wenn Ihre URLs beginnen, codierte Versionen von Zeichen außerhalb des ASCII-Zeichensatzes zu enthalten.

Leider müssen Sie schlauer sein als das, was Apple bietet:

stringByAddingPercentEscapesUsingEncoding:

Dadurch werden alle ungültigen URL-Zeichen maskiert, sodass aus „http://foo.com/hey%20dude/“, was gültig ist, „http://foo.com/hey%2520dud/“ wird, was nicht das ist, was wir wollen .

Laut Apple-Dokumentation: http://developer.apple.com/library/mac/documentation/CoreFOundation/Reference/CFURLRef/Reference/reference.html#//apple_ref/c/func/CFURLCreateStringByAddingPercentEscapes

Ich habe eine NSURL-Kategorie erstellt, die das Richtige tut und mit ungeraden Zeichenfolgen funktioniert, beispielsweise solchen mit teilweiser Codierung (z. B.„http://foo.com/hey dude/i%20do%20it/“).

Hier ist der 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

Es funktioniert gut mit UTF8-String-codierten und ASCII-Strings.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top