Tout d'abord, j'ai trouvé ceci: Objective C HTML escape / unescape , mais cela ne fonctionne pas pour moi.
Mes caractères encodés (proviennent d'un flux RSS, btw) ressemblent à ceci: &
J'ai cherché partout sur le net et trouvé des discussions connexes, mais pas de correctif pour mon encodage particulier, je pense qu'ils sont appelés caractères hexadécimaux.
iphone
html
objective-c
cocoa
cocoa-touch
Treznik
la source
la source
&#...;
dans une chaîne avec son caractère équivalent.8
.Réponses:
Celles-ci sont appelées références d'entités de caractères . Lorsqu'elles prennent la forme de,
&#<number>;
elles sont appelées des références d'entités numériques . Fondamentalement, c'est une représentation sous forme de chaîne de l'octet qui doit être remplacé. Dans le cas de&
, il représente le caractère avec la valeur 38 dans le schéma de codage de caractères ISO-8859-1, qui est&
.La raison pour laquelle l'esperluette doit être encodée en RSS est qu'il s'agit d'un caractère spécial réservé.
Ce que vous devez faire est d'analyser la chaîne et de remplacer les entités par un octet correspondant à la valeur entre
&#
et;
. Je ne connais pas d'excellents moyens de le faire dans l'objectif C, mais cette question de dépassement de pile pourrait être d'une certaine aide.Edit: Depuis que j'ai répondu à cela il y a environ deux ans, il existe d'excellentes solutions; voir la réponse de @Michael Waterfall ci-dessous.
la source
Consultez ma catégorie NSString pour HTML . Voici les méthodes disponibles:
la source
Celui de Daniel est fondamentalement très sympa, et j'y ai corrigé quelques problèmes:
supprimé le caractère de saut pour NSSCanner (sinon les espaces entre deux entités continues seraient ignorés
[scanner setCharactersToBeSkipped: nil];
correction de l'analyse quand il y a des symboles isolés '&' (je ne sais pas quelle est la sortie 'correcte' pour cela, je viens de la comparer à Firefox):
par exemple
voici le code modifié:
la source
À partir d'iOS 7, vous pouvez décoder les caractères HTML de manière native en utilisant un
NSAttributedString
avec l'NSHTMLTextDocumentType
attribut:La chaîne attribuée décodée sera maintenant affichée comme suit: & & <> ™ © ♥ ♣ ♠ ♦.
Remarque: cela ne fonctionnera que s'il est appelé sur le thread principal.
la source
Personne ne semble mentionner l'une des options les plus simples: Google Toolbox pour Mac
(malgré le nom, cela fonctionne aussi sur iOS.)
https://github.com/google/google-toolbox-for-mac/blob/master/Foundation/GTMNSString%2BHTML.h
Et je devais inclure seulement trois fichiers dans le projet: en-tête, implémentation et
GTMDefines.h
.la source
Je devrais poster ceci sur GitHub ou quelque chose comme ça. Cela entre dans une catégorie de NSString, utilise
NSScanner
pour l'implémentation et gère les entités de caractères numériques hexadécimaux et décimaux ainsi que les entités symboliques habituelles.En outre, il gère les chaînes mal formées (lorsque vous avez un & suivi d'une séquence de caractères non valide) de manière relativement gracieuse, ce qui s'est avéré crucial dans mon application publiée qui utilise ce code.
la source
goto
s comme style de code terrible. Vous devez remplacer la lignegoto finish;
parbreak;
.C'est ainsi que je le fais en utilisant le framework RegexKitLite :
}
J'espère que cela aidera quelqu'un.
la source
vous pouvez utiliser uniquement cette fonction pour résoudre ce problème.
la source
Voici une version Swift de la réponse de Walty Yeung :
la source
En fait, le formidable framework MWFeedParser de Michael Waterfall (référé à sa réponse) a été bifurqué par rmchaara qui l'a mis à jour avec le support ARC!
Vous pouvez le trouver dans Github ici
Cela fonctionne vraiment très bien, j'ai utilisé la méthode stringByDecodingHTMLEntities et fonctionne parfaitement.
la source
Comme si vous aviez besoin d'une autre solution! Celui-ci est assez simple et assez efficace:
la source
Si vous avez la référence d'entité de caractère sous forme de chaîne, par exemple
@"2318"
, vous pouvez extraire une NSString recodée avec le caractère Unicode correct en utilisantstrtoul
;la source
Version Swift 3 de la réponse de Jugale
la source