Em primeiro lugar, descobri o seguinte: Objetivo C HTML escapar / unescape , mas não funciona para mim.
Meus caracteres codificados (vêm de um feed RSS, aliás) são assim: &
Eu procurei por toda a rede e encontrei discussões relacionadas, mas nenhuma correção para minha codificação particular, eu acho que eles são chamados de caracteres hexadecimais.
iphone
html
objective-c
cocoa
cocoa-touch
treznik
fonte
fonte
&#...;
em uma string por seu caractere equivalente.8
.Respostas:
Essas são chamadas de referências de entidade de personagem . Quando assumem a forma de
&#<number>;
, são chamadas de referências numéricas de entidades . Basicamente, é uma representação em string do byte que deve ser substituído. No caso de&
, representa o caractere com o valor 38 no esquema de codificação de caracteres ISO-8859-1, que é&
.O motivo pelo qual o e comercial precisa ser codificado em RSS é que ele é um caractere especial reservado.
O que você precisa fazer é analisar a string e substituir as entidades por um byte que corresponda ao valor entre
&#
e;
. Não conheço nenhuma ótima maneira de fazer isso no objetivo C, mas essa questão de estouro de pilha pode ser de alguma ajuda.Edit: Desde a resposta a isso há cerca de dois anos, existem algumas grandes soluções; veja a resposta de @Michael Waterfall abaixo.
fonte
Verifique minha categoria NSString para HTML . Aqui estão os métodos disponíveis:
fonte
O de Daniel é basicamente muito bom, e resolvi alguns problemas lá:
removeu o caractere de salto para NSSCanner (caso contrário, os espaços entre duas entidades contínuas seriam ignorados
[scanner setCharactersToBeSkipped: nil];
consertou a análise quando há símbolos '&' isolados (não tenho certeza de qual é a saída 'correta' para isso, apenas comparei com o firefox):
por exemplo
aqui está o código modificado:
fonte
A partir do iOS 7, você pode decodificar caracteres HTML nativamente usando um
NSAttributedString
com oNSHTMLTextDocumentType
atributo:A string atribuída decodificada agora será exibida como: & & <> ™ © ♥ ♣ ♠ ♦.
Observação: isso só funcionará se for chamado no tópico principal.
fonte
Ninguém parece mencionar uma das opções mais simples: Google Toolbox for Mac
(apesar do nome, também funciona no iOS).
https://github.com/google/google-toolbox-for-mac/blob/master/Foundation/GTMNSString%2BHTML.h
E eu tive que incluir apenas três arquivos no projeto: cabeçalho, implementação e
GTMDefines.h
.fonte
Devo postar isso no GitHub ou algo assim. Isso vai em uma categoria de NSString, usa
NSScanner
para a implementação e lida com entidades de caracteres numéricos hexadecimais e decimais, bem como os simbólicos usuais.Além disso, ele lida com strings malformadas (quando você tem um & seguido por uma sequência inválida de caracteres) de forma relativamente elegante, o que acabou sendo crucial em meu aplicativo lançado que usa esse código.
fonte
goto
s como seu péssimo estilo de código. Você deve substituir a linhagoto finish;
porbreak;
.É assim que faço isso usando a estrutura RegexKitLite :
}
Espero que isso ajude alguém.
fonte
você pode usar apenas esta função para resolver este problema.
fonte
Aqui está uma versão rápida da resposta de Walty Yeung :
fonte
Na verdade, o ótimo framework MWFeedParser de Michael Waterfall (referido à sua resposta) foi bifurcado por rmchaara que o atualizou com suporte ARC!
Você pode encontrar no Github aqui
Realmente funciona muito bem, usei o método stringByDecodingHTMLEntities e funciona perfeitamente.
fonte
Como se precisasse de outra solução! Este é muito simples e bastante eficaz:
fonte
Se você tiver o Character Entity Reference como uma string, por exemplo
@"2318"
, você pode extrair um NSString recodificado com o caractere Unicode correto usandostrtoul
;fonte
Versão Swift 3 da resposta de Jugale
fonte