URLにMr.XとMr.Yの文字列を渡すにはどうすればよいですか。
私はこれを試しましたが、これはアンパサンド以外のすべての文字を実行します。
[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]
URLにMr.XとMr.Yの文字列を渡すにはどうすればよいですか。
私はこれを試しましたが、これはアンパサンド以外のすべての文字を実行します。
[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]
またはさらに短い:
@implementation NSString (Escaping)
- (NSString*)stringWithPercentEscape {
return [(NSString *) CFURLCreateStringByAddingPercentEscapes(
NULL,
(CFStringRef)[[self mutableCopy] autorelease],
NULL,
CFSTR("=,!$&'()*+;@?\n\"<>#\t :/"),
kCFStringEncodingUTF8) autorelease];
}
@end
そして、ここでも ARC 準拠のインライン関数ヘルパーとして示しています。
#if __has_feature(objc_arc)
static inline NSString *hxURLEscape(NSString *v) {
static CFStringRef _hxURLEscapeChars = CFSTR("=,!$&'()*+;@?\r\n\"<>#\t :/");
return ((__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(
NULL,
(__bridge CFStringRef)[v mutableCopy],
NULL,
_hxURLEscapeChars,
kCFStringEncodingUTF8));
}
#endif
-stringByAddingPercentEscapesUsingEncoding:
完全なエスケープ エンコーディングは実行しません。を使用してエンコーディングを手動で追加する必要があります-replaceOccurrencesOfString:withString:
https://devforums.apple.com/message/15674#15674で最初に提案された完全なリスト (Gamecat のリストをミラーリング) を次に示します。Nick が指摘しているように、これはコストがかかるため、エスケープの実際の要件を考慮せずに、単純に完全なリストを含めないでください。
NSMutableString *escaped = [actionString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
[escaped replaceOccurrencesOfString:@"$" withString:@"%24" options:NSCaseInsensitiveSearch range:wholeString];
[escaped replaceOccurrencesOfString:@"&" withString:@"%26" options:NSCaseInsensitiveSearch range:wholeString];
[escaped replaceOccurrencesOfString:@"+" withString:@"%2B" options:NSCaseInsensitiveSearch range:wholeString];
[escaped replaceOccurrencesOfString:@"," withString:@"%2C" options:NSCaseInsensitiveSearch range:wholeString];
[escaped replaceOccurrencesOfString:@"/" withString:@"%2F" options:NSCaseInsensitiveSearch range:wholeString];
[escaped replaceOccurrencesOfString:@":" withString:@"%3A" options:NSCaseInsensitiveSearch range:wholeString];
[escaped replaceOccurrencesOfString:@";" withString:@"%3B" options:NSCaseInsensitiveSearch range:wholeString];
[escaped replaceOccurrencesOfString:@"=" withString:@"%3D" options:NSCaseInsensitiveSearch range:wholeString];
[escaped replaceOccurrencesOfString:@"?" withString:@"%3F" options:NSCaseInsensitiveSearch range:wholeString];
[escaped replaceOccurrencesOfString:@"@" withString:@"%40" options:NSCaseInsensitiveSearch range:wholeString];
[escaped replaceOccurrencesOfString:@" " withString:@"%20" options:NSCaseInsensitiveSearch range:wholeString];
[escaped replaceOccurrencesOfString:@"\t" withString:@"%09" options:NSCaseInsensitiveSearch range:wholeString];
[escaped replaceOccurrencesOfString:@"#" withString:@"%23" options:NSCaseInsensitiveSearch range:wholeString];
[escaped replaceOccurrencesOfString:@"<" withString:@"%3C" options:NSCaseInsensitiveSearch range:wholeString];
[escaped replaceOccurrencesOfString:@">" withString:@"%3E" options:NSCaseInsensitiveSearch range:wholeString];
[escaped replaceOccurrencesOfString:@"\"" withString:@"%22" options:NSCaseInsensitiveSearch range:wholeString];
[escaped replaceOccurrencesOfString:@"\n" withString:@"%0A" options:NSCaseInsensitiveSearch range:wholeString];
このコードは確かに URL のハッシュを作成します。
%26 を URL エスケープとして使用します。
その他のエスケープ:
$ %24
& %26
+ %2B
, %2C
/ %2F
: %3A
; %3B
= %3D
? %3F
@ %40
stringByAddingPercentEscapesUsingEncoding
では正しく動作しません+
。
より簡単な解決策は次のとおりです。
[[[urlString stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding] stringByReplacingOccurrencesOfString:@"&" withString:@"%26"] stringByReplacingOccurrencesOfString:@"+" withString:@"%2b"];
URLでは、アンパサンドは、クエリ文字列変数が含まれていることを示す保護されたキーワードです。値自体の一部として入れることはできません。あなたはそれを何か他のものに変える必要があります。
StackOverflowで尋ねられた同じ質問へのリンクは次のとおりです:ASP.Net URLEncode Ampersand for use in Query String