Подтвердить что ты не робот

NSString URL-декодирование?

Я пробовал много подходов, но эта маленькая маленькая строка просто не может быть расшифрована URL.

NSString *decoded;
NSString *encoded = @"fields=ID%2CdeviceToken";
decoded = (__bridge NSString*)CFURLCreateStringByReplacingPercentEscapesUsingEncoding(NULL, (CFStringRef)encoded, NULL, NSUTF8StringEncoding);
NSLog(@"decodedString %@", decoded);

Приведенный выше код просто регистрирует одну и ту же строку (!) после замены процентных экранов.

Есть ли там надежное решение? Я думаю, что какое-то решение RegEx, основанное на некоторой документации, может работать. Любое предложение?

4b9b3361

Ответ 1

Используйте CFSTR("") вместо NULL для второго аргумента. Из ссылки CFURL:

charactersToLeaveEscaped

Персонажи, чьи процентные escape-последовательности, такие как %20 для символа пробела, вы хотите оставить без изменений. Передайте NULL, чтобы указать, что никакие процентные экраны не будут заменены, или пустую строку (CFSTR ("")), чтобы указать, что все будут заменены.

    NSString *encoded = @"fields=ID%2CdeviceToken";
    NSString *decoded = (__bridge_transfer NSString *)CFURLCreateStringByReplacingPercentEscapesUsingEncoding(NULL, (CFStringRef)encoded, CFSTR(""), kCFStringEncodingUTF8);
    NSLog(@"decodedString %@", decoded);

Печать

2013-03-26 21: 48: 52.559 URLDecoding [28794: 303] decodedString fields = ID, deviceToken

Ответ 2

Другой вариант:

NSString *decoded = [encoded stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

Ответ 3

CFURLCreateStringByReplacingPercentEscapesUsingEncoding устарел в iOS 9. Вместо этого используйте stringByRemovingPercentEncoding.

NSString *decoded = [encoded stringByRemovingPercentEncoding];

Ответ 4

Swift 3

import Foundation

let charSet = CharacterSet.urlPathAllowed.union(.urlQueryAllowed) // just use what you need, either path or query
let enc = "Test Test Test".addingPercentEncoding(withAllowedCharacters: charSet)!
let dec = enc.removingPercentEncoding!

print("Encoded: \(enc)")
print("Decoded: \(dec)")

Вывод:

Encoded: Test %20Test %20Test

Декодировано: тестовый тестовый тест