Замена для stringByAddingPercentEscapesUsingencoding в ios9?


в 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?

7 95

7 ответов:

в сообщении об осуждении говорится (акцент мой):

вместо этого используйте stringByAddingPercentEncodingWithallowedcharacters (_:),, который всегда использует рекомендуемую кодировку UTF-8, и который кодирует для конкретного компонента URL или подкомпонента, поскольку каждый компонент URL или подкомпонент имеет разные правила для допустимых символов.

так что вам нужно только поставить адекватный NSCharacterSet в качестве аргумента. К счастью, для URL-адресов есть очень удобный метод класса называется URLHostAllowedCharacterSet что вы можете использовать такой:

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

обновление Swift 3 -- метод становится статическим свойством urlHostAllowed:

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

имейте в виду, однако, что:

этот метод предназначен для процентного кодирования компонента URL или строки подкомпонента, а не всей строки URL.

Для Цели-C:

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

где найти набор для NSUTF8StringEncoding?

есть предопределенные наборы символов для шести компонентов 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

в сообщении об осуждении говорится (акцент мой):

вместо этого используйте stringByAddingPercentEncodingWithallowedcharacters (_:),который всегда использует рекомендуемый UTF-8 кодировка, и который кодирует для конкретного компонента URL или подкомпонента, поскольку каждый компонент URL или подкомпонент имеет разные правила для допустимых символов.

так что вам нужно только поставить адекватный NSCharacterSet в качестве аргумента. К счастью, для URL-адресов есть очень удобный метод класса под названием URLHostAllowedCharacterSet что вы можете использовать такой:

NSCharacterSet *set = [NSCharacterSet URLHostAllowedCharacterSet]; 

имейте в виду, однако, что:

этот метод предназначен для процентного кодирования компонента URL или строка подкомпонента, а не вся строка URL.

URLHostAllowedCharacterSet - это НЕ РАБОТАЕТ ДЛЯ МЕНЯ. Я использую .

С

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

SWIFT-4

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

следующие полезные (инвертированные) наборы символов:

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

С

этот код работает для меня :

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

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 {  == "/" }.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() }.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;
}
}

Для Swift 3.0

можно использовать urlHostAllowed набор символов.

/// возвращает набор символов для символов, разрешенных в субкомпоненте URL узла.

public static var urlHostAllowed: CharacterSet { get }

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

что означает " этот метод предназначен для процентного кодирования компонента URL или строки подкомпонента, а не всей строки URL."? - GeneCode Sep 1 ' 16 в 8: 30

Это означает, что вы не должны закодировать https://xpto.example.com/path/subpath url, но только то, что идет после ?.

предполагается, потому что есть прецеденты для этого в таких случаях, как:

https://example.com?redirectme=xxxxx

здесь xxxxx - это полностью закодированный URL-адрес.