2012-02-08 7 views
8

私は真剣にここに脳のおならを持っていますが、なぜこのコードはの私の人生のために符号化していないのか分かりません。何度も検索していて、コードサンプルをエンコードすることさえできません。何か案は?今後の参考のために文字列はiOSでURLエンコードされません

NSString *searchString = @"waffl&es"; 

NSString *encodedSearchString = [searchString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
NSString *urlString = [NSString stringWithFormat:@"http://en.wikipedia.org/?search=%@", encodedSearchString]; 
NSURL *url = [NSURL URLWithString:urlString]; 

答えて

24

、これは私が(すなわち、適切にすべてをエンコードする)動作するように見つけたものです

+ (NSString*)encodeURL:(NSString *)string 
{ 
    NSString *newString = (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (__bridge CFStringRef)string, NULL, CFSTR(":/?#[]@!$ &'()*+,;=\"<>%{}|\\^~`"), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding)); 

    if (newString) 
    { 
     return newString; 
    } 

    return @""; 
} 
+2

誰もがなぜ理解できますか?これはうまくいきますが、なぜstringByAddingPercentEscapesUsingEncoding:は時々ありませんか? –

+4

この回答で使用しているブリッジキャストが正しくないため、メモリリークが発生します。結果には '__bridge_transfer'を使用してください。詳細については、この質問を参照してください:http://stackoverflow.com/questions/6822473/correct-bridging-for-arc –

+0

@CarlosRicardo stringByAddingPercentEscapesUsingEncoding:有効なURL文字ではないエスケープ文字のみを対象としています。 "&"は有効なURL文字なので、エスケープされません。ただし、クエリパラメータに "&"を含める場合は、代わりにこのコードを使用してエスケープする必要があります。 – bugloaf