Extraigo un archivo JSON de un sitio y una de las cadenas recibidas es:
The Weeknd ‘King Of The Fall’ [Video Premiere] | @TheWeeknd | #SoPhi
¿Cómo puedo convertir cosas como ‘
en los caracteres correctos?
He creado un Xcode Playground para demostrarlo:
import UIKit
var error: NSError?
let blogUrl: NSURL = NSURL.URLWithString("http://sophisticatedignorance.net/api/get_recent_summary/")
let jsonData = NSData(contentsOfURL: blogUrl)
let dataDictionary = NSJSONSerialization.JSONObjectWithData(jsonData, options: nil, error: &error) as NSDictionary
var a = dataDictionary["posts"] as NSArray
println(a[0]["title"])
json
swift
html-entities
code_cookies
fuente
fuente
La respuesta de @ akashivskyy es excelente y demuestra cómo utilizar
NSAttributedString
para decodificar entidades HTML. Una posible desventaja (como él dijo) es que también se elimina todo el marcado HTML, por lo quese convierte
En OS X hay
CFXMLCreateStringByUnescapingEntities()
quien hace el trabajo:pero esto no está disponible en iOS.
Aquí hay una implementación pura de Swift. Decodifica referencias de entidades de caracteres como
<
usar un diccionario, y todas las entidades de caracteres numéricos como@
o€
. (Tenga en cuenta que no enumeré todas las 252 entidades HTML explícitamente).Swift 4:
Ejemplo:
Swift 3:
Swift 2:
fuente
strtooul(string, nil, base)
completo hará que el código no funcione con entidades de caracteres numéricos y se bloquee cuando se trata de una entidad que no reconoce (en lugar de fallar con gracia).Versión Swift 3 de la extensión de @ akashivskyy ,
fuente
Swift 4
fuente
Versión Swift 2 de la extensión de @ akashivskyy,
fuente
Versión Swift 4
fuente
rawValue
sintaxisNSAttributedString.DocumentReadingOptionKey(rawValue: NSAttributedString.DocumentAttributeKey.documentType.rawValue)
yNSAttributedString.DocumentReadingOptionKey(rawValue: NSAttributedString.DocumentAttributeKey.characterEncoding.rawValue)
es horrible. Reemplácelo con.documentType
y.characterEncoding
fuente
Estaba buscando una utilidad Swift 3.0 pura para escapar / no escapar de las referencias de caracteres HTML (es decir, para aplicaciones Swift del lado del servidor en macOS y Linux) pero no encontré ninguna solución integral, así que escribí mi propia implementación: https: //github.com/IBM-Swift/swift-html-entities
El paquete,
HTMLEntities
funciona con referencias de caracteres con nombre HTML4, así como referencias de caracteres numéricos hexadecimales / dec, y reconocerá referencias de caracteres numéricos especiales según la especificación W3 HTML5 (es decir, no€
debe escapar como el símbolo del Euro (unicodeU+20AC
) y NO como el unicode carácter paraU+0080
, y ciertos rangos de referencias de caracteres numéricos deben reemplazarse con el carácter de reemplazoU+FFFD
al desempacar).Ejemplo de uso:
Y para el ejemplo de OP:
Editar:
HTMLEntities
ahora admite referencias de caracteres con nombre HTML5 a partir de la versión 2.0.0. También se implementa el análisis que cumple con las especificaciones.fuente
( ͡° ͜ʖ ͡° )
), mientras que ninguna de las otras respuestas lo logran.Swift 4:
La solución total que finalmente funcionó para mí con código HTML y caracteres de nueva línea y comillas simples
Uso:
Luego tuve que aplicar algunos filtros más para deshacerme de las comillas simples (por ejemplo, no , no , es , etc.) y nuevos caracteres de línea como
\n
:fuente
Este sería mi enfoque. Puede agregar el diccionario de entidades desde https://gist.github.com/mwaterfall/25b4a6a06dc3309d9555 que menciona Michael Waterfall.
Ejemplos utilizados:
O
fuente
Elegant Swift 4 Solution
Si quieres una cuerda,
agregue esta extensión a su proyecto:
Si desea una cadena NSAttributedString con negrita, cursiva, enlaces, etc.,
agregue esta extensión a su proyecto:
fuente
Versión var calculada de la respuesta de @yishus
fuente
Swift 4
fuente
fuente
Swift 4
Uso simple
fuente
Swift 4
Realmente me gusta la solución usando documentAttributes. Sin embargo, puede ser demasiado lento para analizar archivos y / o uso en celdas de vista de tabla. No puedo creer que Apple no proporcione una solución decente para esto.
Como solución alternativa, encontré esta extensión de cadena en GitHub que funciona perfectamente y es rápida para decodificar.
Entonces, para situaciones en las que la respuesta dada es lenta , vea la solución sugerida en este enlace: https://gist.github.com/mwaterfall/25b4a6a06dc3309d9555
Nota: no analiza las etiquetas HTML.
fuente
Respuesta actualizada trabajando en Swift 3
fuente
C objetivo
fuente
Versión Swift 3.0 con conversión de tamaño de fuente real
Normalmente, si convierte directamente contenido HTML en una cadena atribuida, el tamaño de la fuente aumenta. Puede intentar convertir una cadena HTML en una cadena atribuida y viceversa para ver la diferencia.
En cambio, aquí está la conversión del tamaño real que asegura que el tamaño de la fuente no cambie, aplicando la proporción de 0,75 en todas las fuentes:
fuente
Swift 4
fuente
rawValue
sintaxisNSAttributedString.DocumentReadingOptionKey(rawValue: NSAttributedString.DocumentAttributeKey.documentType.rawValue)
yNSAttributedString.DocumentReadingOptionKey(rawValue: NSAttributedString.DocumentAttributeKey.characterEncoding.rawValue)
es horrible. Reemplácelo con.documentType
y.characterEncoding
Eche un vistazo a HTMLString: una biblioteca escrita en Swift que permite que su programa agregue y elimine entidades HTML en cadenas
Para completar, copié las características principales del sitio:
fuente
Versión Swift 5.1
Además, si desea extraer la fecha, las imágenes, los metadatos, el título y la descripción, puede usar mi pod llamado:
.
Kit de legibilidad
fuente
Utilizar:
fuente