18

我已经尝试了很多方法,但是这个小字符串不能被 URL 解码。

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

上面的代码在替换百分比转义后只记录相同的 (!) 字符串。

有可靠的解决方案吗?我认为某种基于某些文档的 RegEx 解决方案可能会起作用。有什么建议吗?

4

4 回答 4

33

另一种选择是:

NSString *decoded = [encoded stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
于 2013-03-27T03:52:57.347 回答
18

使用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] 解码字符串字段=ID,deviceToken

于 2013-03-27T03:49:31.967 回答
14

CFURLCreateStringByReplacingPercentEscapesUsingEncoding在 iOS 9 中已弃用。请改用stringByRemovingPercentEncoding

NSString *decoded = [encoded stringByRemovingPercentEncoding];
于 2015-12-21T08:23:57.527 回答
1

斯威夫特 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

解码:测试测试测试

于 2017-02-17T14:25:18.350 回答