NSString URL解码?

19

我尝试了很多方法,但这个小字符串就是无法进行URL解码。

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

上面的代码只是替换百分号转义后记录相同的字符串!

有可靠的解决方案吗?我认为基于某些文档的正则表达式解决方案可能有效。有什么建议吗?


对于Swift语言,让decoded等于encoded!.stringByReplacingPercentEscapesUsingEncoding(NSUTF8StringEncoding)。 - johndpope
4个回答

34

另一个选择是:

NSString *decoded = [encoded stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

3
例如,我在执行此操作后仍然在我的网址中看到百分号:http%3A%2F%2Fwebsite.com - Alioo
@Alioo 这段代码在 iOS10.1 的示例中可以正常工作,你当时使用的是哪个系统版本?我认为接口的实现已经发生了变化。 - KudoCC

18

在第二个-to-last参数上使用CFSTR("")而不是NULL。根据CFURL参考文献:

charactersToLeaveEscaped

要保留其百分比转义序列(例如空格字符的%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] 解码字符串 fields=ID‭,‬deviceToken


@Carl 当我尝试你的代码时,它在控制台中打印出 Decoded String : (null)。我找到了原因。我使用了 kCFStringEncodingUTF8 而不是 NSUTF8StringEncoding,这样就可以正常工作了。 - Geek

14

CFURLCreateStringByReplacingPercentEscapesUsingEncoding已在iOS 9中弃用。请使用stringByRemovingPercentEncoding代替。

NSString *decoded = [encoded stringByRemovingPercentEncoding];

1

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)")

输出:

编码后:Test%20Test%20Test

解码后:Test Test Test


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接