ios9에서 stringByAddingPercentEscapesUsingEncoding을 대체합니까?


112

iOS8 및 이전 버전에서는 다음을 사용할 수 있습니다.

NSString *str = ...; // some URL
NSString *result = [str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

iOS9에서 다음 stringByAddingPercentEscapesUsingEncoding으로 대체되었습니다 stringByAddingPercentEncodingWithAllowedCharacters.

NSString *str = ...; // some URL
NSCharacterSet *set = ???; // where to find set for NSUTF8StringEncoding?
NSString *result = [str stringByAddingPercentEncodingWithAllowedCharacters:set];

내 질문은 : 적절한 교체 를 위해 필요한 NSCharacterSet( NSUTF8StringEncoding)을 어디에서 찾을 수 stringByAddingPercentEscapesUsingEncoding있습니까?

답변:


131

지원 중단 메시지는 다음과 같습니다.

대신 항상 권장 UTF-8 인코딩 을 사용하고 각 URL 구성 요소 또는 하위 구성 요소에 유효한 문자에 대한 규칙이 다르기 때문에 특정 URL 구성 요소 또는 하위 구성 요소를 인코딩하는 stringByAddingPercentEncodingWithAllowedCharacters (_ :)를 대신 사용하십시오 .

따라서 적절한 NSCharacterSet인수 만 제공하면 됩니다. 다행히도 URL의 URLHostAllowedCharacterSet경우 다음과 같이 사용할 수 있는 매우 편리한 클래스 메서드 가 있습니다.

let encodedHost = unencodedHost.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet())

Swift 3 업데이트 -메서드가 정적 속성이됩니다 urlHostAllowed.

let encodedHost = unencodedHost.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)

그러나 다음 사항에 유의하십시오.

이 메서드는 전체 URL 문자열이 아닌 URL 구성 요소 또는 하위 구성 요소 문자열을 퍼센트 인코딩하기위한 것입니다.


6
또한 NSURLComponents퍼센트 인코딩을 처리 할 수 있는를 사용하는 것이 좋습니다 .
Antonio Favata 2015 년

1
전체 URL 문자열에 사용할 사항에 대한 제안 사항이 있습니까?
Skill M2

1
@ SkillM2 NSURLComponents(각 구성 요소가 해당 퍼센트로 인코딩 됨 NSCharacterSet)가 올바른 방법이라고 생각합니다.
Antonio Favata 2015 년

2
절대로 전체 URL 문자열을 인코딩하려고 시도해서는 안됩니다. 예기치 않은 버그가 발생할 수 있으며 경우에 따라 보안 허점이 발생할 수 있습니다. URL을 인코딩하는 유일한 확실한 방법은 한 번에 하나씩 수행하는 것입니다.
dgatwood

큰. 고마워요, 친구!
Felipe

100

Objective-C의 경우 :

NSString *str = ...; // some URL
NSCharacterSet *set = [NSCharacterSet URLHostAllowedCharacterSet]; 
NSString *result = [str stringByAddingPercentEncodingWithAllowedCharacters:set];

NSUTF8StringEncoding에 대한 집합은 어디에서 찾을 수 있습니까?

백분율 인코딩을 허용하는 6 개의 URL 구성 요소 및 하위 구성 요소에 대해 미리 정의 된 문자 집합이 있습니다. 이러한 문자 집합은에 전달됩니다 -stringByAddingPercentEncodingWithAllowedCharacters:.

 // Predefined character sets for the six URL components and subcomponents which allow percent encoding. These character sets are passed to -stringByAddingPercentEncodingWithAllowedCharacters:.
@interface NSCharacterSet (NSURLUtilities)
+ (NSCharacterSet *)URLUserAllowedCharacterSet;
+ (NSCharacterSet *)URLPasswordAllowedCharacterSet;
+ (NSCharacterSet *)URLHostAllowedCharacterSet;
+ (NSCharacterSet *)URLPathAllowedCharacterSet;
+ (NSCharacterSet *)URLQueryAllowedCharacterSet;
+ (NSCharacterSet *)URLFragmentAllowedCharacterSet;
@end

지원 중단 메시지는 다음과 같습니다.

대신 항상 권장 UTF-8 인코딩 을 사용하고 각 URL 구성 요소 또는 하위 구성 요소에 유효한 문자에 대한 규칙이 다르기 때문에 특정 URL 구성 요소 또는 하위 구성 요소를 인코딩하는 stringByAddingPercentEncodingWithAllowedCharacters (_ :)를 대신 사용하십시오 .

따라서 적절한 NSCharacterSet인수 만 제공하면 됩니다. 다행히도 URL의 URLHostAllowedCharacterSet경우 다음과 같이 사용할 수 있는 매우 편리한 클래스 메서드 가 있습니다.

NSCharacterSet *set = [NSCharacterSet URLHostAllowedCharacterSet]; 

그러나 다음 사항에 유의하십시오.

이 메서드는 전체 URL 문자열이 아닌 URL 구성 요소 또는 하위 구성 요소 문자열을 퍼센트 인코딩하기위한 것입니다.


4
저는 Apple이 삶을 편하게 해줄 때를 좋아합니다. 감사합니다 사과.
오리

5
"이 메서드는 전체 URL 문자열이 아닌 URL 구성 요소 또는 하위 구성 요소 문자열을 퍼센트 인코딩하기위한 것입니다."의 의미는 무엇입니까? ?
GeneCode

4
URLHostAllowedCharacterSet이 "Unsupported URL"이라는 오류를 표시하고 URLFragmentAllowedCharacterSet을 사용했으며 제대로 작동합니다.
anoop4real

1
이것은 +와 함께 작동하지 않으며 인코딩하지 않으며 사양에 따라 서버 측의 공백으로 대체됩니다.
Torge 2017 년

45

URLHostAllowedCharacterSet되어 작동하지 ME하십시오. URLFragmentAllowedCharacterSet대신 사용 합니다.

목표 -C

NSCharacterSet *set = [NSCharacterSet URLFragmentAllowedCharacterSet];
NSString * encodedString = [@"url string" stringByAddingPercentEncodingWithAllowedCharacters:set];

SWIFT-4

"url string".addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)

다음은 유용한 (반전 된) 문자 세트입니다.

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

감사와 같은 또한 당신에게
Arpit B Parekh 씨

이러한 세트에는 +. 따라서 문자열의 더하기 기호는 쿼리 매개 변수에서 전달되면 엉망이됩니다. 서버 측에서``로 처리됩니다.
Asmo Soinio

21

목표 -C

이 코드는 나를 위해 작동합니다.

urlString = [urlString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLFragmentAllowedCharacterSet]];

4

Swift 2.2:

extension String {
 func encodeUTF8() -> String? {
//If I can create an NSURL out of the string nothing is wrong with it
if let _ = NSURL(string: self) {

    return self
}

//Get the last component from the string this will return subSequence
let optionalLastComponent = self.characters.split { $0 == "/" }.last


if let lastComponent = optionalLastComponent {

    //Get the string from the sub sequence by mapping the characters to [String] then reduce the array to String
    let lastComponentAsString = lastComponent.map { String($0) }.reduce("", combine: +)


    //Get the range of the last component
    if let rangeOfLastComponent = self.rangeOfString(lastComponentAsString) {
        //Get the string without its last component
        let stringWithoutLastComponent = self.substringToIndex(rangeOfLastComponent.startIndex)


        //Encode the last component
        if let lastComponentEncoded = lastComponentAsString.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.alphanumericCharacterSet()) {


        //Finally append the original string (without its last component) to the encoded part (encoded last component)
        let encodedString = stringWithoutLastComponent + lastComponentEncoded

            //Return the string (original string/encoded string)
            return encodedString
        }
    }
}

return nil;
}
}

2

Swift 3.0의 경우

urlHostAllowedcharacterSet 을 사용할 수 있습니다 .

/// 호스트 URL 하위 구성 요소에서 허용되는 문자에 대한 문자 집합을 반환합니다.

public static var urlHostAllowed: CharacterSet { get }

WebserviceCalls.getParamValueStringForURLFromDictionary(settingsDict as! Dictionary<String, AnyObject>).addingPercentEncoding(withAllowedCharacters: CharacterSet.urlHostAllowed)

1

"이 메서드는 전체 URL 문자열이 아닌 URL 구성 요소 또는 하위 구성 요소 문자열을 퍼센트 인코딩하기위한 것입니다."의 의미는 무엇입니까? ? – GeneCode '16 년 9 월 1 일 8시 30 분

이는 https://xpto.example.com/path/subpathURL 의을 인코딩해서는 안되지만 ?.

다음과 같은 경우에 사용 사례가 있기 때문에 가정합니다.

https://example.com?redirectme=xxxxx

xxxxx완전히 인코딩 된 URL은 어디에 있습니까 ?


0

수락 된 답변에 추가. 이 메모를 고려

이 메서드는 전체 URL 문자열이 아닌 URL 구성 요소 또는 하위 구성 요소 문자열을 퍼센트 인코딩하기위한 것입니다.

전체 URL을 인코딩해서는 안됩니다.

let param = "=color:green|\(latitude),\(longitude)&\("zoom=13&size=\(width)x\(height)")&sensor=true&key=\(staticMapKey)".addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) 
let url = "https://maps.google.com/maps/api/staticmap?markers" + param!
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.