Я извлекаю файл JSON с сайта, и одна из полученных строк:
The Weeknd ‘King Of The Fall’ [Video Premiere] | @TheWeeknd | #SoPhi
Как я могу преобразовать такие вещи ‘
в правильные символы?
Я сделал площадку Xcode, чтобы продемонстрировать это:
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
источник
источник
Ответ @ akashivskyy отличный и демонстрирует, как использовать
NSAttributedString
для декодирования объектов HTML. Одним из возможных недостатков (как он заявил) является то, что вся разметка HTML также удаляется, поэтомустановится
В OS X есть то,
CFXMLCreateStringByUnescapingEntities()
что выполняет эту работу:но это недоступно в iOS.
Вот чистая реализация Swift. Он декодирует ссылки на символьные сущности, такие как
<
использование словаря, и все числовые символьные сущности, такие как@
или€
. (Обратите внимание, что я не перечислил все 252 объекта HTML явно.)Swift 4:
Пример:
Swift 3:
Swift 2:
источник
strtooul(string, nil, base)
кода приведет к тому, что код не будет работать с числовыми символьными объектами и выйдет из строя, когда дело доходит до объекта, который он не распознает (вместо изящного отказа).Swift 3 версия расширения @akashivskyy ,
источник
Swift 4
источник
Swift 2 версия расширения @akashivskyy,
источник
Версия Swift 4
источник
rawValue
синтаксисNSAttributedString.DocumentReadingOptionKey(rawValue: NSAttributedString.DocumentAttributeKey.documentType.rawValue)
иNSAttributedString.DocumentReadingOptionKey(rawValue: NSAttributedString.DocumentAttributeKey.characterEncoding.rawValue)
ужасен. Заменить на.documentType
и.characterEncoding
источник
Я искал чистую утилиту Swift 3.0 для выхода / unescape из ссылок на символы HTML (то есть для серверных приложений Swift как в macOS, так и в Linux), но не нашел никаких всеобъемлющих решений, поэтому я написал свою собственную реализацию: https: //github.com/IBM-Swift/swift-html-entities
Пакет
HTMLEntities
,, работает со ссылками на именованные символы HTML4, а также с ссылками на шестнадцатеричные / десятичные числовые символы, и он распознает специальные числовые ссылки на символы в соответствии со спецификацией W3 HTML5 (т.€
Е. Не должно быть экранировано как знак евро (юникодU+20AC
), а НЕ как юникод символ дляU+0080
, и определенные диапазоны ссылок на числовые символы должны быть заменены символом заменыU+FFFD
при отмене экранирования).Пример использования:
И для примера OP:
Изменить:
HTMLEntities
теперь поддерживает ссылки на именованные символы HTML5 начиная с версии 2.0.0. Также реализован синтаксический анализ, соответствующий спецификации.источник
( ͡° ͜ʖ ͡° )
), тогда как ни один из других ответов не справляется с этим.Swift 4:
Полное решение, которое, наконец, сработало для меня с кодом HTML, символами новой строки и одинарными кавычками
Использование:
Затем мне пришлось применить еще несколько фильтров , чтобы избавиться от одинарных кавычек (например, не , не имеет , это и т.д.), и символы новой строки , как
\n
:источник
Это был бы мой подход. Вы можете добавить словарь сущностей из https://gist.github.com/mwaterfall/25b4a6a06dc3309d9555, упомянутого Майклом Уотерфоллом.
Использованные примеры:
ИЛИ
источник
Элегантное решение Swift 4
Если вам нужна строка,
добавьте это расширение в свой проект:
Если вам нужна NSAttributedString с полужирным шрифтом, курсивом, ссылками и т. Д.,
добавьте это расширение в свой проект:
источник
Вычисленная вариация ответа @yishus
источник
Swift 4
источник
источник
Swift 4
Простое использование
источник
Swift 4
Мне очень нравится решение с использованием documentAttributes. Однако он может быть слишком медленным для анализа файлов и / или использования в ячейках табличного представления. Не могу поверить, что Apple не предлагает для этого достойного решения.
В качестве обходного пути я нашел это расширение String на GitHub, которое отлично работает и быстро декодируется.
Поэтому для ситуаций, в которых данный ответ является медленным , см. Предлагаемое решение по этой ссылке: https://gist.github.com/mwaterfall/25b4a6a06dc3309d9555
Примечание: он не анализирует HTML-теги.
источник
Обновленный ответ, работающий над Swift 3
источник
Objective-C
источник
Версия Swift 3.0 с преобразованием фактического размера шрифта
Обычно при прямом преобразовании содержимого HTML в строку с атрибутами размер шрифта увеличивается. Вы можете попробовать преобразовать строку HTML в строку с атрибутами и обратно, чтобы увидеть разницу.
Вместо этого, вот преобразование фактического размера, которое гарантирует, что размер шрифта не изменится, путем применения коэффициента 0,75 ко всем шрифтам:
источник
Swift 4
источник
rawValue
синтаксисNSAttributedString.DocumentReadingOptionKey(rawValue: NSAttributedString.DocumentAttributeKey.documentType.rawValue)
иNSAttributedString.DocumentReadingOptionKey(rawValue: NSAttributedString.DocumentAttributeKey.characterEncoding.rawValue)
ужасен. Заменить на.documentType
и.characterEncoding
Взгляните на HTMLString - библиотеку, написанную на Swift, которая позволяет вашей программе добавлять и удалять объекты HTML в строках.
Для полноты картины я скопировал с сайта основные функции:
источник
Версия Swift 5.1
Кроме того, если вы хотите извлечь дату, изображения, метаданные, заголовок и описание, вы можете использовать мой модуль с именем:
,
Комплект для чтения
источник
Использование:
источник