سؤال

في التطبيق الذي أكتبه لدي بعض التعليمات البرمجية مثل هذا:

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

NSURL* url = [NSURL URLWithString:myurl];

[ws openURL:url];

والفرق الرئيسي هو ذلك myurl يأتي من مكان خارج عن إرادتي.لاحظ أن %d في عنوان URL ليس صحيحًا تمامًا ويعني أن URLWithString يفشل ويعود لا شيء.

ما هي الطريقة "الصحيحة" للتعامل مع هذا؟هل أحتاج إلى تحليل السلسلة وترميز الوسائط بشكل صحيح؟أم أن هناك طريقة ذكية في الكاكاو تقوم بكل العمل الشاق من أجلي؟

هل كانت مفيدة؟

المحلول

لست متأكدًا مما إذا كان هذا هو بالضبط ما تبحث عنه، ولكن هناك طريقة في NSString من شأنها تطهير عنوان URL:

stringByAddingPercentEscapesUsingEncoding:

نصائح أخرى

أعتقد أن السلوك هنا صحيح، لأن %d ليس مكونًا صالحًا لعنوان URL (% هو الهروب، ولكنه يتوقع أن يتبعه حرفان سداسي عشريان).

لا يمكنك فقط تشفير URL لعنوان URL كما هو مُعطى لك، لأن ذلك سيؤدي إلى تشفير /s و؟s أيضًا، وهو ما لا تريده.

لذا، السؤال هو، ما هو السلوك الصحيح هنا؟

ربما تريد أن تتحول إلى...

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

(أي.يتم ترميز % إلى الإصدار المشفر من % في عنوان URL، لذلك عندما تحصل الطريقة على الإدخال، ترى أنه تم تعيينه على %d)

لا أعتقد أن هناك أي وظيفة مكتبة يمكنها القيام بهذا النوع من الأشياء نيابةً عنك، نظرًا لعدم وجود طريقة "صحيحة" للقيام بذلك.الشيء الصحيح الوحيد الذي يمكنك فعله هو إرجاع رسالة خطأ تفيد بأن عنوان URL الذي حصلت عليه غير صالح (تمامًا كما هو الحال مع URLWithString)


إذا أردت محاولة التعامل مع الإدخال، أعتقد أنك ستحتاج إلى البحث في عنوان URL عن أي رموز % لا يتبعها على الفور حرفان سداسي عشريان، ثم استبدل % بـ %25 في هذه الحالة.يجب أن يكون ذلك ممكنًا تمامًا مع التعبير العادي، على الرغم من أنني أظن أنه قد تكون هناك بعض التعقيدات الإضافية إذا بدأت عناوين URL الخاصة بك تحتوي على إصدارات مشفرة من الأحرف خارج مجموعة أحرف ASCII.

لسوء الحظ، يجب أن تكون أكثر ذكاءً مما توفره شركة Apple:

stringByAddingPercentEscapesUsingEncoding:

سيؤدي هذا إلى تجنب كافة أحرف URL غير الصالحة بحيث يصبح "http://foo.com/hey%20dude/"، الصالح، "http://foo.com/hey%2520dud/"، وهو ليس ما نريده .

وفقًا لوثائق Apple : http://developer.apple.com/library/mac/documentation/CoreFOundation/Reference/CFURLRef/Reference/reference.html#//apple_ref/c/func/CFURLCreateStringByAddingPercentEscapes

لقد قمت بإنشاء فئة NSURL التي تفعل الشيء الصحيح وتعمل مع سلسلة غريبة مثل تلك ذات التشفير الجزئي (أي."http://foo.com/hey dude/i%20do%20it/").

هنا هو الرمز:

@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

إنه يعمل بشكل جيد مع سلسلة UTF8 المشفرة وسلسلة ASCII.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top