2013-03-27 16 views
17

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

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

上記のコードは、エスケープ率を置き換えた後に同じ(!)文字列を記録します。

そこには信頼できる解決策がありますか?私は、いくつかのドキュメントに基づいたRegExソリューションが動作すると思う。なにか提案を?

+0

復号迅速LETため=エンコードされた!.stringByReplacingPercentEs capesUsingEncoding(NSUTF8StringEncoding); – johndpope

答えて

17

最後の2番目の引数にはNULLの代わりにCFSTR("")を使用します。 CFURL referenceから:そのような空白文字のための20%として、そのパーセントエスケープシーケンス

charactersToLeaveEscaped

文字、あなたはそのまま残しておきたいです。エスケープされないパーセントのエスケープを指定する場合はNULLを渡し、すべてが置換されることを指定する場合は空の文字列(CFSTR( ""))を渡します。

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

プリント:

2013年3月26日21:48:52.559 URLDecoding [28794:303] decodedStringフィールド= ID、deviceToken

+0

ありがとう、ありがとう。 – Geri

+0

@Carl私はあなたのコードを試してみると、コンソールに 'Decoded String:(null) 'を表示します。私はその理由を見つけた。 NSUTF8StringEncodingの代わりに、私は 'kCFStringEncodingUTF8'を使いました。 – Geek

+0

@Geekはそれをキャッチしてくれてありがとう! –

33

別のオプション希望be:

NSString *decoded = [encoded stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
+3

これを実行した後も、私は今でもパーセンテージを持っています。 http%3A%2F%2Fwebsite.com – Alioo

+0

ios 6.0は何ですか? – BergP

+0

このアプローチは、iOS2.0 + –

11

CFURLCreateStringByReplacingPercentEscapesUsingEncodingは代わりにiOS版9. stringByRemovingPercentEncodingに廃止されました。

NSString *decoded = [encoded stringByRemovingPercentEncoding]; 
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)") 

出力:

エンコード:テスト%20Test%20Test

デコード:テストテストテスト