23

URLにMr.XとMr.Yの文字列を渡すにはどうすればよいですか。

私はこれを試しましたが、これはアンパサンド以外のすべての文字を実行します。

[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]
4

6 に答える 6

36

またはさらに短い:

@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
于 2009-07-28T08:11:44.633 に答える
32

-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 のハッシュを作成します。

于 2009-04-01T15:28:54.813 に答える
4

%26 を URL エスケープとして使用します。

その他のエスケープ:

$  %24
&  %26
+  %2B
,  %2C
/  %2F
:  %3A
;  %3B
=  %3D
?  %3F
@  %40
于 2009-04-01T13:30:04.630 に答える
0

stringByAddingPercentEscapesUsingEncodingでは正しく動作しません+

より簡単な解決策は次のとおりです。

[[[urlString stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding] stringByReplacingOccurrencesOfString:@"&" withString:@"%26"] stringByReplacingOccurrencesOfString:@"+" withString:@"%2b"];
于 2013-05-12T23:24:00.943 に答える
-2

URLでは、アンパサンドは、クエリ文字列変数が含まれていることを示す保護されたキーワードです。値自体の一部として入れることはできません。あなたはそれを何か他のものに変える必要があります。

StackOverflowで尋ねられた同じ質問へのリンクは次のとおりです:ASP.Net URLEncode Ampersand for use in Query String

于 2009-04-01T13:24:34.033 に答える