Swift 3
No Swift 3 há addingPercentEncoding
let originalString = "test/test"
let escapedString = originalString.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)
print(escapedString!)
Resultado:
teste% 2Ftest
Swift 1
No iOS 7 e acima, há stringByAddingPercentEncodingWithAllowedCharacters
var originalString = "test/test"
var escapedString = originalString.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet())
println("escapedString: \(escapedString)")
Resultado:
teste% 2Ftest
Os seguintes são conjuntos de caracteres úteis (invertidos):
URLFragmentAllowedCharacterSet "#%<>[\]^`{|}
URLHostAllowedCharacterSet "#%/<>?@\^`{|}
URLPasswordAllowedCharacterSet "#%/:<>?@[\]^`{|}
URLPathAllowedCharacterSet "#%;<>?[\]^`{|}
URLQueryAllowedCharacterSet "#%<>[\]^`{|}
URLUserAllowedCharacterSet "#%/:<>?@[\]^`
Se você deseja que um conjunto diferente de caracteres seja escapado, crie um conjunto:
Exemplo com o caractere "=" adicionado:
var originalString = "test/test=42"
var customAllowedSet = NSCharacterSet(charactersInString:"=\"#%/<>?@\\^`{|}").invertedSet
var escapedString = originalString.stringByAddingPercentEncodingWithAllowedCharacters(customAllowedSet)
println("escapedString: \(escapedString)")
Resultado:
teste% 2Ftest% 3D42
Exemplo para verificar caracteres ascii que não estão no conjunto:
func printCharactersInSet(set: NSCharacterSet) {
var characters = ""
let iSet = set.invertedSet
for i: UInt32 in 32..<127 {
let c = Character(UnicodeScalar(i))
if iSet.longCharacterIsMember(i) {
characters = characters + String(c)
}
}
print("characters not in set: \'\(characters)\'")
}
stringByAddingPercentEncodingWithAllowedCharacters()
deixa pouca dúvida sobre o que faz. Comentário interessante considerando quanto tempo a palavra: "perplexo" é.&
ao conjunto de caracteresURLQueryAllowedCharacterSet
e obtive cada caractere codificado. Verificado com iOS 9, parece buggy, fui com a resposta de @ bryanchen, funciona bem !!URLComponents
eURLQueryItem
é muito mais limpa IMO.Você pode usar URLComponents para evitar a codificação manual da porcentagem da sua consulta:
fonte
URLQueryItem
nem sempre codifica corretamente. Por exemplo,Formula+One
seria codificado paraFormula+One
, que seria decodificado paraFormula One
. Portanto, tenha cuidado com o sinal de mais.Swift 3:
1. encodingQuery:
resultado:
2. encodingURL:
resultado:
fonte
urlHostAllowed
para codificar parâmetros de consulta em incorreta porque não vai codificar?
,=
e+
. Ao codificar parâmetros de consulta, você deve codificar o nome e o valor do parâmetro separadamente e corretamente. Isso não funcionará em um caso geral.urlHostAllowed
URLComponents
.+
caracter. Portanto, a única opção é fazê-lo manualmente:CharacterSet.urlQueryAllowed.subtracting(CharacterSet(charactersIn: "+"))
Swift 3:
fonte
Swift 4
Para codificar um parâmetro no URL, acho que usar o
.alphanumerics
conjunto de caracteres é a opção mais fácil:O uso de qualquer um dos conjuntos de caracteres padrão para codificação de URL (como
URLQueryAllowedCharacterSet
ouURLHostAllowedCharacterSet
) não funcionará, porque eles não excluem=
ou&
caracteres.Nota que, usando
.alphanumerics
ele vai codificar alguns personagens que não precisam de ser codificados (como-
,.
,_
ou~
- ver 2.3 Caracteres não-reservados. Em RFC 3986). Acho que usar.alphanumerics
mais simples do que construir um conjunto de caracteres personalizado e não me importo com a adição de alguns caracteres adicionais a serem codificados. Se isso lhe incomoda, construa um conjunto de caracteres personalizado, conforme descrito em Como codificar por cento uma String de URL , como por exemplo:Aviso: O
encoded
parâmetro é força desembrulhada. Para uma string unicode inválida, pode falhar. Consulte Por que o valor de retorno de String.addingPercentEncoding () é opcional? . Em vez de forçar o desembrulhamento,encoded!
você pode usarencoded ?? ""
ou usarif let encoded = ...
.fonte
Tudo é igual
fonte
.bridgeToOvjectiveC()
argumentou e não recebeu "Não é possível converter o tipo da expressão 'CFString!' digitar 'CFString!' "?Swift 4:
Depende das regras de codificação seguidas pelo seu servidor.
A Apple oferece esse método de classe, mas não informa o tipo de protocolo RCF a seguir.
Seguindo esta ferramenta útil , você deve garantir a codificação desses caracteres para seus parâmetros:
Em outras palavras, falando sobre a codificação de URL, você deve seguir o protocolo RFC 1738 .
E Swift não cobre a codificação do + char por exemplo , mas funciona bem com esses três @:?caracteres.
Portanto, para codificar corretamente cada parâmetro, a
.urlHostAllowed
opção não é suficiente, você deve adicionar também os caracteres especiais, como por exemplo:Espero que isso ajude alguém que fica louco a procurar essas informações.
fonte
Swift 4 (não testado - por favor, comente se funciona ou não. Obrigado @ sumizome pela sugestão)
Swift 3
Swift 2.2 (Empréstimo de Zaph e correção de chave de consulta de URL e valores de parâmetro)
Exemplo:
Esta é uma versão mais curta da resposta de Bryan Chen. Eu acho que isso
urlQueryAllowed
está permitindo que os caracteres de controle sejam bons, a menos que eles façam parte da chave ou do valor na cadeia de caracteres da consulta, quando eles precisam ser escapados.fonte
var
) e depois o chama.remove
em uma segunda etapa.Swift 4.2
Uma solução rápida de uma linha. Substitua
originalString
pela String que você deseja codificar.Demonstração do Playground on-line
fonte
Eu também precisava disso, então escrevi uma extensão String que permite as seqüências de caracteres URLEncoding, bem como o objetivo final mais comum, converter um dicionário de parâmetros em URLs no estilo "GET".
Aproveitar!
fonte
&
ou=
nos parâmetros. Verifique minha solução.Este está trabalhando para mim.
Eu encontrei a função acima neste link: http://useyourloaf.com/blog/how-to-percent-encode-a-url-string/ .
fonte
let Url = URL(string: urlString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? "")
fonte
SWIFT 4.2
Às vezes, isso aconteceu apenas porque há espaço na lesma OU ausência de codificação de URL para os parâmetros que passam pela URL da API.
NOTA: Não esqueça de explorar
bitmapRepresentation
.fonte
Isso está funcionando para mim no Swift 5 . O caso de uso está usando um URL da área de transferência ou similar que já pode ter caracteres escapados, mas que também contém caracteres Unicode que podem causar
URLComponents
ouURL(string:)
falhar.Primeiro, crie um conjunto de caracteres que inclua todos os caracteres legais de URL:
Em seguida, estenda
String
com um método para codificar URLs:Que pode ser testado como:
Valor de
url
no final:https://www.example.com/%ED%8F%B4%EB%8D%94/search?q=123&foo=bar&multi=eggs+and+ham&hangul=%ED%95%9C%EA%B8%80&spaced=lovely%20spam&illegal=%3C%3E#top
Observe que os espaços
%20
e o+
espaçamento são preservados, os caracteres Unicode são codificados,%20
o originalurlText
não é codificado duas vezes e a âncora (fragmento ou#
) permanece.Editar: agora verificando a validade de cada componente.
fonte
Para que o Swift 5 finalize a sequência de códigos
Como usar ?
fonte
Nenhuma dessas respostas funcionou para mim. Nosso aplicativo falhou quando um URL continha caracteres não ingleses.
Dependendo dos parâmetros do que você está tentando fazer, você pode apenas criar seu próprio conjunto de caracteres. O texto acima permite caracteres em inglês e
-._~/?%$!:
fonte