を使用しない方法のiOS 9に廃止されましたか?CFURLCreateStringByAddingPercentEscapesは、私は次のコードを持っている「stringByAddingPercentEncodingWithAllowedCharacters」
ありがとうございます!
を使用しない方法のiOS 9に廃止されましたか?CFURLCreateStringByAddingPercentEscapesは、私は次のコードを持っている「stringByAddingPercentEncodingWithAllowedCharacters」
ありがとうございます!
文字この
NSString *value = @"<url>";
value = [value stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
を試すには、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
];
スペース、%などの文字をエンコードしません。最も安全な方法は、URLQueryAllowedCharacterSetで始まり、[here](https://stackoverflow.com/a/47790833/3046117)に示すように、キーと値に許可されていない文字を削除することです。 – supik
:ちょうどそのコードを試してみてください
- (NSString *)encodeByAddingPercentEscapes {
NSMutableCharacterSet *charset = [[NSCharacterSet URLQueryAllowedCharacterSet] mutableCopy];
[charset removeCharactersInString:@"!*'();:@&=+$,/?%#[]"];
NSString *encodedValue = [self stringByAddingPercentEncodingWithAllowedCharacters:charset];
return encodedValue;
}
'#'、 '%'、 '['、 ']'(一般に安全ではなく、 'URLQueryAllowedCharacterSet'の一部ではありません)を削除する必要はありません。 – supik
慎重に、 'URLQueryAllowedCharacterSet'が含まれています' + '文字であるため、この文字はエンコードされません。しかし、+文字は特別な意味を持っているので、SPACEを意味するので、 'test + test'をそのようにエンコードすると、サーバ側では全くエンコードされず、' test test'にデコードされます。 – Mecki
@Meckiだから、許可された文字セットから '+'を除外する方法は?たぶん 'removeCharactersInString:@" + "'を使って、この文字セットから '+'を除外することができます。 – loretoparisi
@ loretoparisi私は通常、このようにしますhttp://stackoverflow.com/a/39371482/15809結局のところ、あなたは絶対にエンコードしなければならない文字はほとんどありませんが、好きな場合はすべての文字をエンコードすることができます。 – Mecki