18

私はそこに多くのアプローチを試みましたが、この小さな小さな文字列はURLデコードできません。

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

上記のコードは、パーセントエスケープを置き換えた後、同じ(!)文字列をログに記録するだけです。

そこに信頼できる解決策はありますか?いくつかのドキュメントに基づくある種の正規表現ソリューションが機能すると思います。なにか提案を?

4

4 に答える 4

33

別のオプションは次のとおりです。

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

最後から2番目の引数のCFSTR("")代わりにを使用します。CFURLリファレンスNULLから:

characterToLeaveEscaped

スペース文字の%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] decodeString fields = ID、deviceToken

于 2013-03-27T03:49:31.967 に答える
14

CFURLCreateStringByReplacingPercentEscapesUsingEncodingはた。代わりに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 に答える