Estou puxando um arquivo JSON de um site e uma das seqüências de caracteres recebidas é:
The Weeknd ‘King Of The Fall’ [Video Premiere] | @TheWeeknd | #SoPhi
Como posso converter coisas como ‘
nos caracteres corretos?
Eu criei um Xcode Playground para demonstrá-lo:
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
fonte
fonte
A resposta de @ akashivskyy é ótima e demonstra como utilizar
NSAttributedString
para decodificar entidades HTML. Uma possível desvantagem (como ele afirmou) é que toda a marcação HTML também é removida, portantotorna-se
No OS X, existe o
CFXMLCreateStringByUnescapingEntities()
que faz o trabalho:mas isso não está disponível no iOS.
Aqui está uma implementação pura do Swift. Decodifica referências de entidades de caracteres como
<
usar um dicionário e todas as entidades de caracteres numéricos como@
ou€
. (Observe que eu não listei todas as 252 entidades HTML explicitamente.)Swift 4:
Exemplo:
Swift 3:
Swift 2:
fonte
strtooul(string, nil, base)
completamente fará com que o código não funcione com entidades de caracteres numéricos e trava quando se trata de uma entidade que não reconhece (em vez de falhar normalmente).Versão Swift 3 da extensão @ akashivskyy ,
fonte
Swift 4
fonte
Versão Swift 2 da extensão @ akashivskyy,
fonte
Versão Swift 4
fonte
rawValue
sintaxeNSAttributedString.DocumentReadingOptionKey(rawValue: NSAttributedString.DocumentAttributeKey.documentType.rawValue)
eNSAttributedString.DocumentReadingOptionKey(rawValue: NSAttributedString.DocumentAttributeKey.characterEncoding.rawValue)
é horrível. Substitua-o por.documentType
e.characterEncoding
fonte
Eu estava procurando por um utilitário Swift 3.0 puro para escapar / remover as referências de caracteres HTML (ou seja, para aplicativos Swift do lado do servidor no macOS e Linux), mas não encontrei nenhuma solução abrangente, então escrevi minha própria implementação: https: //github.com/IBM-Swift/swift-html-entities
O pacote
HTMLEntities
funciona com referências de caracteres nomeados HTML4, bem como referências de caracteres numéricos hex / dec, e reconhecerá referências de caracteres numéricos especiais de acordo com a especificação HTML5 do W3 (ou seja,€
deve ser sem escape como o sinal Euro (unicodeU+20AC
) e NOT como o unicode caractere paraU+0080
, e certos intervalos de referências de caracteres numéricos devem ser substituídos pelo caractere de substituiçãoU+FFFD
ao retirar o caractereExemplo de uso:
E para o exemplo do OP:
Editar:
HTMLEntities
agora suporta referências de caracteres nomeados HTML5 a partir da versão 2.0.0. A análise compatível com especificações também é implementada.fonte
( ͡° ͜ʖ ͡° )
), enquanto nenhuma das outras respostas gerencia isso.Swift 4:
A solução total que finalmente funcionou para mim com código HTML, caracteres de nova linha e aspas simples
Uso:
Eu tive que aplicar mais alguns filtros para se livrar de aspas simples (por exemplo, não , não , é , etc.) e novos caracteres de linha, como
\n
:fonte
Essa seria a minha abordagem. Você pode adicionar o dicionário de entidades em https://gist.github.com/mwaterfall/25b4a6a06dc3309d9555 .
Exemplos utilizados:
OU
fonte
Solução elegante Swift 4
Se você quer uma string,
adicione esta extensão ao seu projeto:
Se você deseja um NSAttributedString com negrito, itálico, links etc.,
adicione esta extensão ao seu projeto:
fonte
Versão var computada da resposta do @yishus
fonte
Swift 4
fonte
fonte
Swift 4
Uso Simples
fonte
Swift 4
Eu realmente gosto da solução usando documentAttributes. No entanto, pode ser muito lento para analisar arquivos e / ou uso nas células de exibição de tabela. Não acredito que a Apple não oferece uma solução decente para isso.
Como solução alternativa, encontrei esta Extensão de String no GitHub, que funciona perfeitamente e é rápida para decodificar.
Portanto, para situações nas quais a resposta dada é lenta , consulte a solução sugerida neste link: https://gist.github.com/mwaterfall/25b4a6a06dc3309d9555
Nota: ele não analisa tags HTML.
fonte
Resposta atualizada trabalhando no Swift 3
fonte
Objetivo-C
fonte
Versão Swift 3.0 com conversão de tamanho de fonte real
Normalmente, se você converter diretamente o conteúdo HTML em uma sequência atribuída, o tamanho da fonte aumentará. Você pode tentar converter uma string HTML em uma string atribuída e vice-versa para ver a diferença.
Em vez disso, aqui está a conversão de tamanho real que garante que o tamanho da fonte não seja alterado, aplicando a proporção de 0,75 em todas as fontes:
fonte
Swift 4
fonte
rawValue
sintaxeNSAttributedString.DocumentReadingOptionKey(rawValue: NSAttributedString.DocumentAttributeKey.documentType.rawValue)
eNSAttributedString.DocumentReadingOptionKey(rawValue: NSAttributedString.DocumentAttributeKey.characterEncoding.rawValue)
é horrível. Substitua-o por.documentType
e.characterEncoding
Dê uma olhada no HTMLString - uma biblioteca escrita em Swift que permite ao seu programa adicionar e remover entidades HTML em Strings
Para completar, copiei os principais recursos do site:
fonte
Versão Swift 5.1
Além disso, se você deseja extrair data, imagens, metadados, título e descrição, use meu pod chamado:
.
Kit de legibilidade
fonte
Usar:
fonte