En primer lugar, encontré esto: Objective C HTML escape / unescape , pero no funciona para mí.
Mis caracteres codificados (provienen de una fuente RSS, por cierto) se ven así: &
Busqué en toda la red y encontré discusiones relacionadas, pero no hay solución para mi codificación particular, creo que se llaman caracteres hexadecimales.
iphone
html
objective-c
cocoa
cocoa-touch
treznik
fuente
fuente
&#...;
en una cadena con su carácter equivalente.8
.Respuestas:
Esas se denominan referencias de entidad de carácter . Cuando toman la forma de
&#<number>;
se denominan referencias numéricas de entidad . Básicamente, es una representación de cadena del byte que debe sustituirse. En el caso de&
, representa el carácter con el valor de 38 en el esquema de codificación de caracteres ISO-8859-1, que es&
.La razón por la que el ampersand debe codificarse en RSS es que es un carácter especial reservado.
Lo que debe hacer es analizar la cadena y reemplazar las entidades con un byte que coincida con el valor entre
&#
y;
. No conozco ninguna manera excelente de hacer esto en el objetivo C, pero esta pregunta de desbordamiento de pila podría ser de alguna ayuda.Editar: Desde que respondí a esto hace unos dos años, hay algunas soluciones excelentes; vea la respuesta de @Michael Waterfall a continuación.
fuente
Consulte mi categoría NSString para HTML . Estos son los métodos disponibles:
fuente
El de Daniel es básicamente muy bueno, y solucioné algunos problemas allí:
eliminó el carácter de omisión para NSSCanner (de lo contrario, los espacios entre dos entidades continuas se ignorarían
[escáner setCharactersToBeSkipped: nil];
Se corrigió el análisis cuando hay símbolos '&' aislados (no estoy seguro de cuál es la salida 'correcta' para esto, simplemente la comparé con Firefox):
p.ej
aquí está el código modificado:
fuente
A partir de iOS 7, puede decodificar caracteres HTML de forma nativa utilizando un
NSAttributedString
con elNSHTMLTextDocumentType
atributo:La cadena con atributos decodificados ahora se mostrará como: & & <> ™ © ♥ ♣ ♠ ♦.
Nota: Esto solo funcionará si se llama en el hilo principal.
fuente
Nadie parece mencionar una de las opciones más simples: Google Toolbox para Mac
(a pesar del nombre, esto también funciona en iOS).
https://github.com/google/google-toolbox-for-mac/blob/master/Foundation/GTMNSString%2BHTML.h
Y tuve que incluir solo tres archivos en el proyecto: encabezado, implementación y
GTMDefines.h
.fuente
Debería publicar esto en GitHub o algo así. Esto entra en una categoría de NSString, se usa
NSScanner
para la implementación y maneja entidades de caracteres numéricos hexadecimales y decimales, así como las habituales simbólicas.Además, maneja cadenas mal formadas (cuando tiene un & seguido de una secuencia de caracteres no válida) con relativa elegancia, lo que resultó ser crucial en mi aplicación publicada que usa este código.
fuente
goto
s como su estilo de código terrible. Deberías reemplazar la líneagoto finish;
conbreak;
.Esta es la forma en que lo hago usando el marco RegexKitLite :
}
Espero que esto ayude a alguien.
fuente
puede usar solo esta función para resolver este problema.
fuente
Aquí hay una versión rápida de la respuesta de Walty Yeung :
fuente
En realidad, rmchaara ha bifurcado el gran marco MWFeedParser de Michael Waterfall (referido a su respuesta), ¡y lo ha actualizado con el soporte de ARC!
Puedes encontrarlo en Github aquí
Realmente funciona muy bien, utilicé el método stringByDecodingHTMLEntities y funciona perfectamente.
fuente
¡Como si necesitaras otra solución! Este es bastante simple y bastante efectivo:
fuente
Si tiene la Referencia de entidad de carácter como una cadena, por ejemplo
@"2318"
, puede extraer una NSString recodificada con el carácter Unicode correcto usandostrtoul
;fuente
Swift 3 versión de la respuesta de Jugale
fuente