Comment décoder les entités HTML en swift?
Je suis en tirant un fichier JSON à partir d'un site et l'une des chaînes reçues:
The Weeknd ‘King Of The Fall’ [Video Premiere] | @TheWeeknd | #SoPhi
Comment puis-je convertir des choses comme ‘
dans les caractères corrects?
J'ai fait une Xcode aire de Jeux pour le démontrer:
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"])
OriginalL'auteur code_cookies | 2014-09-01
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas de façon simple de le faire, mais vous pouvez utiliser
NSAttributedString
de la magie pour rendre ce processus aussi indolore que possible (être averti que cette méthode supprime toutes les balises HTML):N'oubliez pas de initialiser NSAttributedString de thread principal seulement. Elle utilise WebKit magie en dessous, donc l'exigence.
Vous pouvez créer votre propre
String
extension pour augmenter la réutilisabilité:Je comprends ce que vous essayez de dire, mais en niant les extensions n'est pas la voie à suivre.
Pour que cela fonctionne correctement avec les caractères non-ASCII, vous devez ajouter un NSCharacterEncodingDocumentAttribute, comparez stackoverflow.com/a/27898167/1187415.
Cette méthode est extrêmement lourd et n'est pas recommandé dans tableviews ou gridviews
C'est génial! Bien que, il bloque le thread principal, est-il possible de l'exécuter dans le thread d'arrière-plan?
OriginalL'auteur akashivskyy
@akashivskyy de réponse est excellent et montre comment utiliser
NSAttributedString
de décoder les entités HTML. L'un des inconvénients possibles(comme il l'a dit), c'est que tous balisage HTML est supprimée, de sorte
devient
Sur OS X il y a
CFXMLCreateStringByUnescapingEntities()
qui fait le travail:mais ce n'est pas disponible sur iOS.
Ici est une pure mise en œuvre rapide. Il décode les entités de caractères
des références comme
<
à l'aide d'un dictionnaire, et tous les caractères numériquesdes entités telles que les
@
ou€
. (Notez que je n'ai pas la liste de tous252 entités HTML explicitement.)
Swift 4:
Exemple:
Swift 3:
Swift 2:
et Martin c'est magnifique! fonctionne comme un charme! - Je mettre à jour l'extension de Swift 2 pastebin.com/juHRJ6au Merci!
J'ai converti cette réponse pour être compatible avec la Swift 2 et le trempa dans un CocoaPod appelé StringExtensionHTML pour la facilité d'utilisation. Notez que Santiago Swift 2 version corrige le moment de la compilation des erreurs, mais de prendre le
strtooul(string, nil, base)
entièrement aura le code risque de ne pas travailler avec des entités de caractère numérique et de crash quand il s'agit d'une entité qu'il ne reconnaît pas (au lieu d'échouer gracieusement).En fait, j'ai converti ma réponse à Swift 2 déjà en septembre 2015. - Il encore se compile sans avertissements avec Swift 2.2/Xcode 7.3. Ou faites-vous allusion à Michael version?
Super réponse!!! Merci beaucoup 😀
OriginalL'auteur Martin R
Swift 3 version de @akashivskyy de l'extension,
Pour les caractères français-je utiliser utf16
OriginalL'auteur yishus
Swift 2 version de @akashivskyy de l'extension,
mis à jour.
OriginalL'auteur Zaid Pathan
Swift 4
J'aime beaucoup la simplicité de cette réponse. Toutefois, il sera causer des plantages lors de l'exécuter en arrière-plan, car il tente de s'exécuter sur le thread principal.
OriginalL'auteur AamirR
OriginalL'auteur wLc
Swift 4 Version
S'il vous plaît, la
rawValue
syntaxeNSAttributedString.DocumentReadingOptionKey(rawValue: NSAttributedString.DocumentAttributeKey.documentType.rawValue)
etNSAttributedString.DocumentReadingOptionKey(rawValue: NSAttributedString.DocumentAttributeKey.characterEncoding.rawValue)
est horrible. Le remplacer par.documentType
et.characterEncoding
OriginalL'auteur pipizanzibar
Je cherchais un pur Swift 3.0 utilitaire pour échapper à/ne pas encoder en HTML références de caractère (c'est à dire du côté serveur Swift applications macOS et Linux) mais n'ai pas trouvé de solutions globales, j'ai donc écrit ma propre mise en œuvre: https://github.com/IBM-Swift/swift-html-entities
Le paquet,
HTMLEntities
, fonctionne avec HTML4 un nom de personnage de références ainsi que hex/dec références à des caractères numériques, et il reconnaîtra spécial références à des caractères numériques par le W3c HTML5 spec (c'est à dire€
devrait être sans échappement comme le signe de l'Euro (unicodeU+20AC
) et non PAS comme le caractère unicodeU+0080
, et certaines gammes de références à des caractères numériques doit être remplacé par le caractère de remplacementU+FFFD
quand unescaping).Exemple d'utilisation:
Et pour l'OP de l'exemple:
Edit:
HTMLEntities
prend désormais en charge le HTML5 nommé références de caractère à partir de la version 2.0.0. Conformes aux spécifications d'analyse est également mis en œuvre.( ͡° ͜ʖ ͡° )
), alors qu'aucun des autres réponses à gérer.OriginalL'auteur Youming Lin
Élégant Swift 4 Solution
Si vous voulez une chaîne
Ajouter cette extension à votre projet
Si vous voulez un NSAttributedString avec Gras, Italique, Liens, etc:
Ajouter cette extension à votre projet
OriginalL'auteur iLandes
Ce serait mon approche. Vous pouvez ajouter les entités dictionnaire de https://gist.github.com/mwaterfall/25b4a6a06dc3309d9555 Michael Cascade mentionne.
Exemples utilisés:
OU
OriginalL'auteur Bseaborn
Calculée var version de @yishus réponse
OriginalL'auteur Geva
Mis à jour répondre de travail sur Swift 3
OriginalL'auteur ravalboy
Swift 4
OriginalL'auteur Haroldo Gondim
Swift 4:
Le total de la solution qui a finalement fonctionné pour moi avec du code html et des caractères de saut de ligne et les guillemets simples
Utilisation:
J'ai eu ensuite d'appliquer quelques filtres supplémentaires pour se débarrasser de
single quotes
( pour exemple:don't, hasn't, It's
etc), et les caractères de nouvelle ligne comme\n
quelqu'un a une upvoted cette réponse et l'a trouvé vraiment utile, ce qui ne fait que vous dire ?
OriginalL'auteur Naishta
Swift 4
Simple D'Utilisation
yup, il y a (édité 1 Nov à 22:37 et fait de la "Simple d'Utilisation" beaucoup plus difficile à comprendre)
OriginalL'auteur quemeful
Swift 3.0 version réelle de la taille de la police de conversion
Normalement, si vous les convertir directement en html attribuée à la chaîne, la taille de la police est augmenté. Vous pouvez essayer de convertir le code html de la chaîne attribuée à la chaîne et à l'arrière à nouveau pour voir la différence.
Au lieu de cela, voici le taille réelle conversion qui assurez-vous que la taille de la police ne change pas, en appliquant le ratio de 0,75 sur toutes les polices
OriginalL'auteur Fangming
SWIFT 4
rawValue
syntaxeNSAttributedString.DocumentReadingOptionKey(rawValue: NSAttributedString.DocumentAttributeKey.documentType.rawValue)
etNSAttributedString.DocumentReadingOptionKey(rawValue: NSAttributedString.DocumentAttributeKey.characterEncoding.rawValue)
est horrible. Le remplacer par.documentType
et.characterEncoding
Les performances de cette solution est horrible. C'est peut-être d'accord pour séparer scae, l'analyse des fichiers n'est pas conseillé.
OriginalL'auteur Omar Freewan
Ont un coup d'oeil à HTMLString - une bibliothèque écrite en Swift qui permet à votre programme pour ajouter et supprimer des entités HTML dans les Chaînes
Pour être complet, j'ai copié principales caractéristiques du site:
OriginalL'auteur Despotovic
OriginalL'auteur Deepak
Swift4
J'aime vraiment la solution à l'aide de documentAttributes cependant, il est peut ralentir pour l'analyse des fichiers et/ou de l'utilisation de la vue tableau de cellules. Je peux pas croire qu'Apple ne fournit pas une solution convenable pour cela.
Comme une solution de contournement, j'ai trouvé sur GitHub cette Chaîne d'Extension qui fonctionne parfaitement et rapide pour le décodage.
Donc, pour les situations dans lesquelles la réponse qui est donnée est de ralentir voir la solution suggèrent dans ce lien:
https://gist.github.com/mwaterfall/25b4a6a06dc3309d9555
Remarque: il n'analyse pas les balises HTML.
OriginalL'auteur Vincent
Objective-C
OriginalL'auteur Oded Regev
NSData dataRes = (nsdata valeur )
var resString = NSString(données: dataRes, d'encodage: NSUTF8StringEncoding)
OriginalL'auteur Yogesh shelke