web-dev-qa-db-ja.com

NSString URLデコード?

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

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

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

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

17
Geri

最後から2番目の引数には、NULLではなくCFSTR("")を使用します。 CFURL参照 から:

文字ToLeaveEscaped

パーセントエスケープシーケンス(スペース文字の%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

17
Carl Veazey

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

NSString *decoded = [encoded stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
32
rmaddy

CFURLCreateStringByReplacingPercentEscapesUsingEncodingはiOS 9で非推奨になりました。代わりにstringByRemovingPercentEncodingを使用してください。

NSString *decoded = [encoded stringByRemovingPercentEncoding];
14
Mohammed Afsul

スウィフト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

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

1
hashier