141

私はNSStringこのようなものを持っています:

http://www.

しかし、私はそれを次のように変換したい:

http%3A%2F%2Fwww.

これどうやってするの?

4

13 に答える 13

333

必要な文字をエスケープするには、もう少し作業が必要です。

サンプルコード

iOS7以降:

NSString *unescaped = @"http://www";
NSString *escapedString = [unescaped stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet]];
NSLog(@"escapedString: %@", escapedString);

NSLog 出力:

エスケープ文字列: http%3A%2F%2Fwww

以下は、有用な URL エンコード文字セットです。

URLFragmentAllowedCharacterSet  "#%<>[\]^`{|}
URLHostAllowedCharacterSet      "#%/<>?@\^`{|}
URLPasswordAllowedCharacterSet  "#%/:<>?@[\]^`{|}
URLPathAllowedCharacterSet      "#%;<>?[\]^`{|}
URLQueryAllowedCharacterSet     "#%<>[\]^`{|}
URLUserAllowedCharacterSet      "#%/:<>?@[\]^`

上記のすべてを組み合わせた文字セットの作成:

NSCharacterSet *URLCombinedCharacterSet = [[NSCharacterSet characterSetWithCharactersInString:@" \"#%/:<>?@[\\]^`{|}"] invertedSet];

Base64 の作成

Base64 文字セットの場合:

NSCharacterSet *URLBase64CharacterSet = [[NSCharacterSet characterSetWithCharactersInString:@"/+=\n"] invertedSet];

スウィフト 3.0 の場合:

var escapedString = originalString.addingPercentEncoding(withAllowedCharacters:.urlHostAllowed)

Swift 2.x の場合:

var escapedString = originalString.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLHostAllowedCharacterSet())

注:stringByAddingPercentEncodingWithAllowedCharactersエンコーディングが必要な UTF-8 文字もエンコードします。

iOS7 より前の Core Foundation
を使用 Core Foundation を ARC で使用:

NSString *escapedString = (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(
    NULL,
   (__bridge CFStringRef) unescaped,
    NULL,
    CFSTR("!*'();:@&=+$,/?%#[]\" "),
    kCFStringEncodingUTF8));

Core Foundation を ARC なしで使用する:

NSString *escapedString = (NSString *)CFURLCreateStringByAddingPercentEscapes(
    NULL,
   (CFStringRef)unescaped,
    NULL,
    CFSTR("!*'();:@&=+$,/?%#[]\" "),
    kCFStringEncodingUTF8);

注:-stringByAddingPercentEscapesUsingEncodingは正しいエンコーディングを生成しません。この場合、同じ文字列を返すものは何もエンコードしません。

stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding14 文字をエンコードします。

`#%^{}[]|\"<> に加えて、パーセント エスケープされたスペース文字。

テスト文字列:

" `~!@#$%^&*()_+-={}[]|\\:;\"'<,>.?/AZaz"  

エンコードされた文字列:

"%20%60~!@%23$%25%5E&*()_+-=%7B%7D%5B%5D%7C%5C:;%22'%3C,%3E.?/AZaz"  

注: この文字セットがニーズを満たしているかどうかを検討し、そうでない場合は必要に応じて変更してください。

エンコードが必要な RFC 3986 文字 (エンコードのプレフィックス文字であるため、% が追加されます):

"!#$&'()*+,/:;=?@[]%"

一部の「予約されていない文字」は、追加でエンコードされます。

"\n\r \"%-.<>\^_`{|}~"

于 2011-11-10T21:50:50.997 に答える
24

これはURL エンコーディングと呼ばれます。詳細はこちら

-(NSString *)urlEncodeUsingEncoding:(NSStringEncoding)encoding {
    return (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL,
           (CFStringRef)self,
           NULL,
           (CFStringRef)@"!*'\"();:@&=+$,/?%#[]% ",
           CFStringConvertNSStringEncodingToEncoding(encoding));
}
于 2011-11-10T21:35:38.627 に答える
7

これは私の解決策ではありません。他の誰かがstackoverflowに書きましたが、方法を忘れました。

どういうわけか、このソリューションは「うまく」機能します。発音区別記号、漢字、およびその他のほとんどすべてを処理します。

- (NSString *) URLEncodedString {
    NSMutableString * output = [NSMutableString string];
    const char * source = [self UTF8String];
    int sourceLen = strlen(source);
    for (int i = 0; i < sourceLen; ++i) {
        const unsigned char thisChar = (const unsigned char)source[i];
        if (false && thisChar == ' '){
            [output appendString:@"+"];
        } else if (thisChar == '.' || thisChar == '-' || thisChar == '_' || thisChar == '~' ||
                   (thisChar >= 'a' && thisChar <= 'z') ||
                   (thisChar >= 'A' && thisChar <= 'Z') ||
                   (thisChar >= '0' && thisChar <= '9')) {
            [output appendFormat:@"%c", thisChar];
        } else {
            [output appendFormat:@"%%%02X", thisChar];
        }
    }
    return output;
}

誰かがこのコードを書いた人を教えてくれたら、本当に感謝します。基本的に、このエンコードされた文字列が希望どおりに正確にデコードされる理由について、彼はいくつかの説明を持っています。

私は彼の解決策を少し修正しました。スペースは + ではなく %20 で表すのが好きです。それで全部です。

于 2012-10-17T05:43:11.340 に答える
4
 NSString * encodedString = (NSString *)CFURLCreateStringByAddingPercentEscapes(NUL,(CFStringRef)@"parameter",NULL,(CFStringRef)@"!*'();@&+$,/?%#[]~=_-.:",kCFStringEncodingUTF8 );

NSURL * url = [[NSURL alloc] initWithString:[@"address here" stringByAppendingFormat:@"?cid=%@",encodedString, nil]];
于 2012-08-30T12:02:11.443 に答える
2

スウィフト iOS:

参考までに:私はこれを使用しました:

extension String {

    func urlEncode() -> CFString {
        return CFURLCreateStringByAddingPercentEscapes(
            nil,
            self,
            nil,
            "!*'();:@&=+$,/?%#[]",
            CFStringBuiltInEncodings.UTF8.rawValue
        )
    }

}// end extension String
于 2015-04-17T12:18:12.557 に答える
1
NSString *str = (NSString *)CFURLCreateStringByAddingPercentEscapes(
                             NULL,
                             (CFStringRef)yourString, 
                             NULL, 
                             CFSTR("/:"), 
                             kCFStringEncodingUTF8);

自分で解放または自動解放する必要がありstrます。

于 2011-11-10T21:39:22.940 に答える
-1

//次のようなNSStringインスタンスメソッドを使用します:

+ (NSString *)encodeURIComponent:(NSString *)string
{
NSString *s = [string stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
return s;
}

+ (NSString *)decodeURIComponent:(NSString *)string
{
NSString *s = [string stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
return s;
}

要求するすべてのURLではなく、パラメータ値に対してのみエンコードまたはデコードする必要があることを忘れないでください。

于 2012-12-09T03:47:46.157 に答える
-8
int strLength = 0;
NSString *urlStr = @"http://www";
NSLog(@" urlStr : %@", urlStr );
NSMutableString *mutableUrlStr = [urlStr mutableCopy];
NSLog(@" mutableUrlStr : %@", mutableUrlStr );
strLength = [mutableUrlStr length];
[mutableUrlStr replaceOccurrencesOfString:@":" withString:@"%3A" options:NSCaseInsensitiveSearch range:NSMakeRange(0, strLength)];
NSLog(@" mutableUrlStr : %@", mutableUrlStr );
strLength = [mutableUrlStr length];
[mutableUrlStr replaceOccurrencesOfString:@"/" withString:@"%2F" options:NSCaseInsensitiveSearch range:NSMakeRange(0, strLength)];
NSLog(@" mutableUrlStr : %@", mutableUrlStr );
于 2011-11-11T15:38:00.380 に答える