[ios] 문자열을 URL로 인코딩하는 방법

NSString공백과 &문자 가있는 URL 문자열 ( )이 있습니다 . &앰퍼샌드 및 공백을 포함하여 전체 문자열을 어떻게 URL 인코딩 합니까?



답변

불행히도 stringByAddingPercentEscapesUsingEncoding항상 100 % 작동하지는 않습니다. URL이 아닌 문자를 인코딩하지만 예약 문자 (슬래시 /및 앰퍼샌드 등 &)는 그대로 둡니다. 분명히 이것은 Apple이 알고 있는 버그 이지만 아직 수정하지 않았기 때문에이 범주를 사용하여 문자열을 URL 인코딩했습니다.

@implementation NSString (NSString_Extended)

- (NSString *)urlencode {
    NSMutableString *output = [NSMutableString string];
    const unsigned char *source = (const unsigned char *)[self UTF8String];
    int sourceLen = strlen((const char *)source);
    for (int i = 0; i < sourceLen; ++i) {
        const unsigned char thisChar = source[i];
        if (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;
}

이런 식으로 사용 :

NSString *urlEncodedString = [@"SOME_URL_GOES_HERE" urlencode];

// Or, with an already existing string:
NSString *someUrlString = @"someURL";
NSString *encodedUrlStr = [someUrlString urlencode];

이것은 또한 작동합니다 :

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

주제에 대한 좋은 독서 :

Objective-c iPhone 퍼센트가 문자열을 인코딩합니까?
Objective-C 및 Swift URL 인코딩

http://cybersam.com/programming/proper-url-percent-encoding-in-ios
https://devforums.apple.com/message/15674#15674
http://simonwoodside.com/weblog/2009/4/ 22 / how_to_really_url_encode /


답변

도움이 될 수 있습니다.

NSString *sampleUrl = @"http://www.google.com/search.jsp?params=Java Developer";
NSString* encodedUrl = [sampleUrl stringByAddingPercentEscapesUsingEncoding:
 NSUTF8StringEncoding];

iOS 7 이상에서 권장되는 방법은 다음과 같습니다.

NSString* encodedUrl = [sampleUrl stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];

URL 구성 요소의 요구 사항에 따라 허용되는 문자 집합을 선택할 수 있습니다.


답변

답변이 선택된 이후에 새로운 API가 추가되었습니다. 이제 NSURLUtilities를 사용할 수 있습니다. URL의 다른 부분에서는 다른 문자를 사용할 수 있으므로 해당 문자 세트를 사용하십시오. 다음 예제는 쿼리 문자열에 포함되도록 인코딩합니다.

encodedString = [myString stringByAddingPercentEncodingWithAllowedCharacters:NSCharacterSet.URLQueryAllowedCharacterSet];

‘&’를 구체적으로 변환하려면 URL 쿼리에서 ‘&’가 허용되므로 URL 쿼리 세트에서 제거하거나 다른 세트를 사용해야합니다.

NSMutableCharacterSet *chars = NSCharacterSet.URLQueryAllowedCharacterSet.mutableCopy;
[chars removeCharactersInRange:NSMakeRange('&', 1)]; // %26
encodedString = [myString stringByAddingPercentEncodingWithAllowedCharacters:chars];


답변

스위프트 2.0 예제 (iOS 9 호환 가능)

extension String {

  func stringByURLEncoding() -> String? {

    let characters = NSCharacterSet.URLQueryAllowedCharacterSet().mutableCopy() as! NSMutableCharacterSet

    characters.removeCharactersInString("&")

    guard let encodedString = self.stringByAddingPercentEncodingWithAllowedCharacters(characters) else {
      return nil
    }

    return encodedString

  }

}


답변

iOS 7 업데이트

NSString *encode = [string stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];

NSString *decode = [encode stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];


답변

CFURLCreateStringByAddingPercentEscapes허용 된 답변으로 주어진 호출 을 사용하기로 선택 했지만 최신 버전의 XCode (및 IOS)에서는 오류가 발생하여 다음을 대신 사용했습니다.

NSString *apiKeyRaw = @"79b|7Qd.jW=])(fv|M&W0O|3CENnrbNh4}2E|-)J*BCjCMrWy%dSfGs#A6N38Fo~";

NSString *apiKey = (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)apiKeyRaw, NULL, (CFStringRef)@"!*'();:@&=+$,/?%#[]", kCFStringEncodingUTF8));


답변

모든 경우를 다루는 stringByAddingPercentEncodingWithAllowedCharacters방법 을 사용하십시오.[NSCharacterSet URLUserAllowedCharacterSet]

목표 C

NSString *value = @"Test / Test";
value = [value stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLUserAllowedCharacterSet]];

빠른

var value = "Test / Test"
value.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLUserAllowedCharacterSet())

산출

Test%20%2F%20Test