Swift 3
En Swift 3 hay addingPercentEncoding
let originalString = "test/test"
let escapedString = originalString.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)
print(escapedString!)
Salida:
test% 2Ftest
Swift 1
En iOS 7 y superior hay stringByAddingPercentEncodingWithAllowedCharacters
var originalString = "test/test"
var escapedString = originalString.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet())
println("escapedString: \(escapedString)")
Salida:
test% 2Ftest
Los siguientes son conjuntos de caracteres útiles (invertidos):
URLFragmentAllowedCharacterSet "#%<>[\]^`{|}
URLHostAllowedCharacterSet "#%/<>?@\^`{|}
URLPasswordAllowedCharacterSet "#%/:<>?@[\]^`{|}
URLPathAllowedCharacterSet "#%;<>?[\]^`{|}
URLQueryAllowedCharacterSet "#%<>[\]^`{|}
URLUserAllowedCharacterSet "#%/:<>?@[\]^`
Si desea que se escape un conjunto diferente de caracteres, cree un conjunto:
Ejemplo con el carácter "=" agregado:
var originalString = "test/test=42"
var customAllowedSet = NSCharacterSet(charactersInString:"=\"#%/<>?@\\^`{|}").invertedSet
var escapedString = originalString.stringByAddingPercentEncodingWithAllowedCharacters(customAllowedSet)
println("escapedString: \(escapedString)")
Salida:
test% 2Ftest% 3D42
Ejemplo para verificar caracteres ascii que no están en el 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()
deja pocas dudas sobre lo que hace. Comentario interesante considerando cuánto tiempo dura la palabra: "estupefacto".&
al conjunto de caracteresURLQueryAllowedCharacterSet
y obtuve cada carácter codificado. Comprobado con iOS 9, parece defectuoso, fui con la respuesta de @ bryanchen, ¡funciona bien!URLComponents
yURLQueryItem
es mucho más limpia IMO.Puede usar URLComponents para evitar tener que codificar manualmente el porcentaje de su cadena de consulta:
fuente
URLQueryItem
no siempre codifica correctamente. Por ejemplo,Formula+One
se codificaría aFormula+One
, que se decodificaría aFormula One
. Por lo tanto, tenga cuidado con el signo más.Swift 3:
1. encodingQuery:
resultado:
2. encodingURL:
resultado:
fuente
urlHostAllowed
para codificar parámetros de consulta incorrectos porque no codificará?
,=
y+
. Al codificar parámetros de consulta, debe codificar el nombre y el valor del parámetro por separado y correctamente. Esto no funcionará en un caso general.urlHostAllowed
URLComponents
.+
carácter. Entonces, la única opción es hacerlo manualmente:CharacterSet.urlQueryAllowed.subtracting(CharacterSet(charactersIn: "+"))
Swift 3:
fuente
Swift 4
Para codificar un parámetro en URL, creo que usar el
.alphanumerics
juego de caracteres es la opción más fácil:El uso de cualquiera de los juegos de caracteres estándar para la codificación de URL (como
URLQueryAllowedCharacterSet
oURLHostAllowedCharacterSet
) no funcionará, ya que no excluyen=
ni&
caracteres.Nota que mediante el uso
.alphanumerics
que va a codificar algunos caracteres que no necesitan ser codificados (como-
,.
,_
o~
- ver 2.3 Los caracteres no reservados. En el RFC 3986). Me parece.alphanumerics
más simple que construir un juego de caracteres personalizado y no me importa codificar algunos caracteres adicionales. Si eso te molesta, construye un juego de caracteres personalizado como se describe en Cómo codificar en porcentaje una Cadena URL , como por ejemplo:Advertencia: el
encoded
parámetro es forzado sin envolver. Para una cadena unicode no válida, podría bloquearse. Consulte ¿Por qué el valor de retorno de String.addingPercentEncoding () es opcional? . En lugar de desenvolver la fuerzaencoded!
, puede usarencoded ?? ""
o usarif let encoded = ...
.fuente
Todo es igual
fuente
.bridgeToOvjectiveC()
segundo argumento y no obtuvo "¡No se puede convertir el tipo de expresión 'CFString!' escribir 'CFString!' "Swift 4:
Depende de las reglas de codificación seguidas por su servidor.
Apple ofrece este método de clase, pero no informa qué tipo de protocolo RCF sigue.
Siguiendo esta útil herramienta , debe garantizar la codificación de estos caracteres para sus parámetros:
En otras palabras, hablando de codificación de URL, debe seguir el protocolo RFC 1738 .
Y Swift no cubre la codificación del + char por ejemplo , pero funciona bien con estos tres @:?caracteres
Entonces, para codificar correctamente cada uno de sus parámetros, la
.urlHostAllowed
opción no es suficiente, debe agregar también los caracteres especiales como, por ejemplo:Espero que esto ayude a alguien que se vuelva loco a buscar esta información.
fuente
Swift 4 (no probado - por favor comente si funciona o no. Gracias @sumizome por su sugerencia)
Swift 3
Swift 2.2 (Préstamo de Zaph's y corrección de valores de parámetros y clave de consulta de URL)
Ejemplo:
Esta es una versión más corta de la respuesta de Bryan Chen. Supongo que eso
urlQueryAllowed
permite que los caracteres de control estén bien, a menos que formen parte de la clave o el valor en la cadena de consulta, en cuyo punto deben escaparse.fuente
var
) y luego invoque.remove
en un segundo paso.Swift 4.2
Una solución rápida de una línea. Reemplace
originalString
con la cadena que desea codificar.Demostración de juegos en línea
fuente
Necesitaba esto yo mismo, así que escribí una extensión de cadena que permite las cadenas URLEncoding, así como el objetivo final más común, convertir un diccionario de parámetros en parámetros de URL de estilo "GET":
¡Disfrutar!
fuente
&
ni=
en los parámetros. Verifique mi solución en su lugar.Este me está funcionando.
Encontré la función anterior desde este enlace: http://useyourloaf.com/blog/how-to-percent-encode-a-url-string/ .
fuente
let Url = URL(string: urlString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? "")
fuente
SWIFT 4.2
A veces esto sucedió solo porque hay espacio en slug O ausencia de codificación de URL para los parámetros que pasan por la URL de API.
NOTA: No olvide explorar sobre
bitmapRepresentation
.fuente
Esto está funcionando para mí en Swift 5 . El caso de uso es tomar una URL del portapapeles o similar que ya puede tener caracteres de escape pero que también contiene caracteres Unicode que podrían causar
URLComponents
oURL(string:)
fallar.Primero, cree un conjunto de caracteres que incluya todos los caracteres legales de URL:
A continuación, extienda
String
con un método para codificar URL:Que se puede probar como:
Valor de
url
al 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
Tenga en cuenta que ambos
%20
y el+
espacio se conservan, los caracteres Unicode están codificados,%20
el originalurlText
no está doblemente codificado y el ancla (fragmento o#
) permanece.Editar: ahora verifica la validez de cada componente.
fuente
Para Swift 5 para codificar la cadena
Cómo utilizar ?
fuente
Ninguna de estas respuestas funcionó para mí. Nuestra aplicación se bloqueaba cuando una url contenía caracteres que no estaban en inglés.
Dependiendo de los parámetros de lo que intente hacer, es posible que desee crear su propio conjunto de caracteres. Lo anterior permite caracteres en inglés y
-._~/?%$!:
fuente