Substituição para stringByAddingPercentEscapesUsingEncoding em ios9?




objective-c url (7)

Para Objective-C:

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

onde encontrar definido para NSUTF8StringEncoding?

Existem conjuntos de caracteres predefinidos para os seis componentes e subcomponentes de URL que permitem a codificação percentual. Esses conjuntos de caracteres são passados ​​para -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

A mensagem de depreciação diz (ênfase minha):

Use stringByAddingPercentEncodingWithAllowedCharacters (_ :) em vez disso, que sempre usa a codificação UTF-8 recomendada e que codifica um componente ou subcomponente de URL específico, pois cada componente ou subcomponente de URL tem regras diferentes para quais caracteres são válidos.

Então você só precisa fornecer um NSCharacterSet adequado como argumento. Felizmente, para URLs, há um método de classe muito útil chamado URLHostAllowedCharacterSet que você pode usar assim:

NSCharacterSet *set = [NSCharacterSet URLHostAllowedCharacterSet]; 

Esteja ciente, porém, que:

Esse método destina-se a codificar por porcentagem uma cadeia de componente ou subcomponente de URL, NÃO uma cadeia de URL inteira.

No iOS8 e anterior eu posso usar:

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

em iOS9 stringByAddingPercentEscapesUsingEncoding foi substituído por stringByAddingPercentEncodingWithAllowedCharacters :

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

e minha pergunta é: onde encontrar NSCharacterSet ( NSUTF8StringEncoding ) necessário para a substituição adequada de stringByAddingPercentEscapesUsingEncoding ?


Adicionando a resposta aceita. Levando em consideração esta nota

Esse método destina-se a codificar por porcentagem uma cadeia de componente ou subcomponente de URL, NÃO uma cadeia de URL inteira.

o URL inteiro não deve ser codificado:

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!

URLHostAllowedCharacterSet NÃO ESTÁ FUNCIONANDO PARA MIM. Eu uso o URLFragmentAllowedCharacterSet .

OBJETIVO -C

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

SWIFT - 4

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

Os seguintes são conjuntos de caracteres úteis (invertidos):

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

A mensagem de depreciação diz (ênfase minha):

Use stringByAddingPercentEncodingWithAllowedCharacters (_ :) em vez disso, que sempre usa a codificação UTF-8 recomendada e que codifica um componente ou subcomponente de URL específico, pois cada componente ou subcomponente de URL tem regras diferentes para quais caracteres são válidos.

Então você só precisa fornecer um NSCharacterSet adequado como argumento. Felizmente, para URLs, há um método de classe muito útil chamado URLHostAllowedCharacterSet que você pode usar assim:

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

Atualização para o Swift 3 - o método se torna a propriedade estática urlHostAllowed :

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

Esteja ciente, porém, que:

Esse método destina-se a codificar por porcentagem uma cadeia de componente ou subcomponente de URL, NÃO uma cadeia de URL inteira.


Objetivo-C

esse código funciona para mim:

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

Qual é o significado de "Este método destina-se a codificar por percentual uma string de componente ou subcomponente de URL, NÃO uma cadeia de URL inteira". ? - GeneCode 1 de setembro de 16 às 8:30

Isso significa que você não deve codificar o https://xpto.example.com/path/subpath do URL, mas apenas o que ocorre após o ? .

Suposto, porque há casos de uso para fazê-lo em casos como:

https://example.com?redirectme=xxxxx

Onde xxxxx é um URL totalmente codificado.


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;
}
}




deprecated