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 caracteresURLQueryAllowedCharacterSety obtuve cada carácter codificado. Comprobado con iOS 9, parece defectuoso, fui con la respuesta de @ bryanchen, ¡funciona bien!URLComponentsyURLQueryItemes mucho más limpia IMO.Puede usar URLComponents para evitar tener que codificar manualmente el porcentaje de su cadena de consulta:
fuente
URLQueryItemno siempre codifica correctamente. Por ejemplo,Formula+Onese 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
urlHostAllowedpara 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.urlHostAllowedURLComponents.+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
.alphanumericsjuego 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
URLQueryAllowedCharacterSetoURLHostAllowedCharacterSet) no funcionará, ya que no excluyen=ni&caracteres.Nota que mediante el uso
.alphanumericsque 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.alphanumericsmá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
encodedpará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
.urlHostAllowedopció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
urlQueryAllowedpermite 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.removeen un segundo paso.Swift 4.2
Una solución rápida de una línea. Reemplace
originalStringcon 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
URLComponentsoURL(string:)fallar.Primero, cree un conjunto de caracteres que incluya todos los caracteres legales de URL:
A continuación, extienda
Stringcon un método para codificar URL:Que se puede probar como:
Valor de
urlal 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#topTenga en cuenta que ambos
%20y el+espacio se conservan, los caracteres Unicode están codificados,%20el originalurlTextno 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