私は多くのアプローチを試みましたが、この小さな文字列はURLデコードできません。
NSString *decoded;
NSString *encoded = @"fields=ID%2CdeviceToken";
decoded = (__bridge NSString*)CFURLCreateStringByReplacingPercentEscapesUsingEncoding(NULL, (CFStringRef)encoded, NULL, NSUTF8StringEncoding);
NSLog(@"decodedString %@", decoded);
上記のコードは、パーセントエスケープを置き換えた後、同じ(!)文字列をログに記録するだけです。
そこに信頼できる解決策はありますか?いくつかのドキュメントに基づくある種の正規表現ソリューションが機能すると思います。なにか提案を?
最後から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
別のオプションは次のとおりです。
NSString *decoded = [encoded stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
CFURLCreateStringByReplacingPercentEscapesUsingEncodingはiOS 9で非推奨になりました。代わりにstringByRemovingPercentEncodingを使用してください。
NSString *decoded = [encoded stringByRemovingPercentEncoding];
スウィフト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
デコード:テストテストテスト