2016-03-04 6 views

答えて

18

文字この

NSString *value = @"<url>"; 
value = [value stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]; 
+3

慎重に、 'URLQueryAllowedCharacterSet'が含まれています' + '文字であるため、この文字はエンコードされません。しかし、+文字は特別な意味を持っているので、SPACEを意味するので、 'test + test'をそのようにエンコードすると、サーバ側では全くエンコードされず、' test test'にデコードされます。 – Mecki

+0

@Meckiだから、許可された文字セットから '+'を除外する方法は?たぶん 'removeCharactersInString:@" + "'を使って、この文字セットから '+'を除外することができます。 – loretoparisi

+1

@ loretoparisi私は通常、このようにしますhttp://stackoverflow.com/a/39371482/15809結局のところ、あなたは絶対にエンコードしなければならない文字はほとんどありませんが、好きな場合はすべての文字をエンコードすることができます。 – Mecki

9

を試すには、URL(..?key1=value1&key2=value2)のクエリ部分に許可されているすべての文字が含まれており、キーに使用できる文字に制限されないが、このような問合せのURLQueryAllowedCharacterSetを設定します。例えば。 URLQueryAllowedCharacterSetは、これらはもちろん(&キー/値のペアを分離し+はスペースを意味する)クエリで許可されているように、&+含まれ、それらはそのようなクエリのキー又はに使用できません。

は、このコードを考えてみましょう:

NSString * key = "my&name"; 
NSString * value = "test+test"; 
NSString * safeKey= [key 
    stringByAddingPercentEncodingWithAllowedCharacters: 
     [NSCharacterSet URLQueryAllowedCharacterSet] 
]; 
NSString * safeValue= [value 
    stringByAddingPercentEncodingWithAllowedCharacters: 
     [NSCharacterSet URLQueryAllowedCharacterSet] 
]; 
NSString * query = [NSString stringWithFormat:@"?%@=%@", safeKey, safeValue]; 

queryは完全に間違っている、?my&name=test+testになります。これは、値がないmyという名前のキーと、値が(+はスペースを意味する)というnameという名前のキーを定義します。

正しいクエリは?my%26name=test%2Btestでした。

ASCII文字列を処理するか、またはサーバーがURL内のUTF-8文字を扱うことができる限り(今日のほとんどのWebサーバーではそうです)、絶対にエンコードする必要のある文字の数は、小さいと非常に一定。 (:+例):これらの文字はURLQueryAllowedCharacterSetで許可されますが、キーまたは値に許可されていないエンコードするために別の解決策

NSCharacterSet * queryKVSet = [NSCharacterSet 
    characterSetWithCharactersInString:":/?&=;[email protected]#$()',*% " 
].invertedSet; 

NSString * value = ...; 
NSString * valueSafe = [value 
    stringByAddingPercentEncodingWithAllowedCharacters:queryKVSet 
]; 
+0

スペース、%などの文字をエンコードしません。最も安全な方法は、URLQueryAllowedCharacterSetで始まり、[here](https://stackoverflow.com/a/47790833/3046117)に示すように、キーと値に許可されていない文字を削除することです。 – supik

1

:ちょうどそのコードを試してみてください

- (NSString *)encodeByAddingPercentEscapes { 
    NSMutableCharacterSet *charset = [[NSCharacterSet URLQueryAllowedCharacterSet] mutableCopy]; 
    [charset removeCharactersInString:@"!*'();:@&=+$,/?%#[]"]; 
    NSString *encodedValue = [self stringByAddingPercentEncodingWithAllowedCharacters:charset]; 
    return encodedValue; 
} 
+0

'#'、 '%'、 '['、 ']'(一般に安全ではなく、 'URLQueryAllowedCharacterSet'の一部ではありません)を削除する必要はありません。 – supik

関連する問題