Pobieram plik JSON z witryny, a jeden z otrzymanych ciągów to:
The Weeknd ‘King Of The Fall’ [Video Premiere] | @TheWeeknd | #SoPhi
Jak mogę zamienić takie rzeczy ‘
na właściwe postacie?
Zrobiłem Xcode Playground, aby to zademonstrować:
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
źródło
źródło
Odpowiedź @ akashivskyy jest świetna i pokazuje, jak wykorzystać
NSAttributedString
do dekodowania encji HTML. Jedną z możliwych wad (jak stwierdził) jest to, że wszystko usuwane są również znaczniki HTML, więcstaje się
Na OS X jest
CFXMLCreateStringByUnescapingEntities()
który wykonuje zadanie:ale to nie jest dostępne na iOS.
Oto czysta implementacja Swift. Odszyfrowuje odniesienia do jednostek znakowych, takie jak
<
użycie słownika, i wszystkie numeryczne jednostki znakowe, takie jak@
lub€
. (Zauważ, że nie wymieniłem wyraźnie wszystkich 252 encji HTML).Swift 4:
Przykład:
Swift 3:
Swift 2:
źródło
strtooul(string, nil, base)
całkowite usunięcie spowoduje, że kod nie będzie działał z numerycznymi jednostkami znakowymi i ulegnie awarii, jeśli chodzi o jednostkę, której nie rozpoznaje (zamiast z wdziękiem).Wersja Swift 3 rozszerzenia @ akashivskyy ,
źródło
Szybki 4
źródło
Wersja Swift 2 rozszerzenia @ akashivskyy,
źródło
Wersja Swift 4
źródło
rawValue
składniaNSAttributedString.DocumentReadingOptionKey(rawValue: NSAttributedString.DocumentAttributeKey.documentType.rawValue)
iNSAttributedString.DocumentReadingOptionKey(rawValue: NSAttributedString.DocumentAttributeKey.characterEncoding.rawValue)
jest okropna. Zamień go na.documentType
i.characterEncoding
źródło
Szukałem czystego narzędzia Swift 3.0, aby uciec do / unescape z odniesień znaków HTML (tj. Dla aplikacji Swift po stronie serwera zarówno na macOS, jak i Linux), ale nie znalazłem żadnych kompleksowych rozwiązań, więc napisałem własną implementację: https: //github.com/IBM-Swift/swift-html-entities
Pakiet,
HTMLEntities
działa z nazwanymi referencjami znakowymi HTML4, jak również numerycznymi referencjami znakowymi hex / dec i rozpoznaje specjalne numeryczne referencje znakowe zgodnie ze specyfikacją W3 HTML5 (tj.€
Powinny być bez znaku zmiany znaczenia jako znak Euro (unicodeU+20AC
), a NIE jako Unicode znak dlaU+0080
, a niektóre zakresy numerycznych odniesień do znaków należy zastąpić znakiem zastępczym,U+FFFD
gdy nie ma znaku zmiany znaczenia).Przykład użycia:
A na przykład OP:
Edycja:
HTMLEntities
teraz obsługuje nazwane odwołania do znaków HTML5 od wersji 2.0.0. Zaimplementowano również analizę zgodną ze specyfikacją.źródło
( ͡° ͜ʖ ͡° )
), podczas gdy żadna z pozostałych odpowiedzi tego nie zarządza.Swift 4:
Kompletne rozwiązanie, które w końcu zadziałało z kodem HTML, znakami nowej linii i pojedynczymi cudzysłowami
Stosowanie:
Następnie musiałem zastosować więcej filtrów, aby pozbyć się pojedynczych cudzysłowów (na przykład nie , nie ma , to itp.) I nowych znaków wiersza, takich jak
\n
:źródło
To byłoby moje podejście. Możesz dodać słownik podmiotów z https://gist.github.com/mwaterfall/25b4a6a06dc3309d9555, o którym wspomina Michael Waterfall.
Zastosowane przykłady:
LUB
źródło
Eleganckie rozwiązanie Swift 4
Jeśli chcesz sznur,
dodaj to rozszerzenie do swojego projektu:
Jeśli chcesz NSAttributedString z pogrubieniem, kursywą, linkami itp.,
dodaj to rozszerzenie do swojego projektu:
źródło
Obliczona zmienna wersja odpowiedzi @yishus
źródło
Szybki 4
źródło
źródło
Szybki 4
Proste użycie
źródło
Szybki 4
Bardzo podoba mi się rozwiązanie wykorzystujące documentAttributes. Jednak może być zbyt wolny do analizowania plików i / lub użycia w komórkach widoku tabeli. Nie mogę uwierzyć, że Apple nie zapewnia na to porządnego rozwiązania.
Aby obejść ten problem, znalazłem to rozszerzenie ciągu na GitHub, które działa doskonale i jest szybkie do dekodowania.
A więc w sytuacjach, w których podana odpowiedź jest wolna , zobacz rozwiązanie sugerowane w tym linku: https://gist.github.com/mwaterfall/25b4a6a06dc3309d9555
Uwaga: nie analizuje tagów HTML.
źródło
Zaktualizowana odpowiedź działająca w Swift 3
źródło
Cel C
źródło
Wersja Swift 3.0 z faktyczną konwersją rozmiaru czcionki
Zwykle, jeśli bezpośrednio konwertujesz zawartość HTML na przypisany ciąg, rozmiar czcionki jest zwiększany. Możesz spróbować przekonwertować ciąg HTML na przypisany ciąg i ponownie, aby zobaczyć różnicę.
Zamiast tego, oto rzeczywista konwersja rozmiaru, która zapewnia, że rozmiar czcionki się nie zmieni, stosując współczynnik 0,75 do wszystkich czcionek:
źródło
Szybki 4
źródło
rawValue
składniaNSAttributedString.DocumentReadingOptionKey(rawValue: NSAttributedString.DocumentAttributeKey.documentType.rawValue)
iNSAttributedString.DocumentReadingOptionKey(rawValue: NSAttributedString.DocumentAttributeKey.characterEncoding.rawValue)
jest okropna. Zastąp go.documentType
i.characterEncoding
Spójrz na HTMLString - bibliotece napisanej w języku Swift, która umożliwia programowi dodawanie i usuwanie encji HTML ciągach znaków
Dla kompletności skopiowałem główne funkcje ze strony:
źródło
Wersja Swift 5.1
Ponadto, jeśli chcesz wyodrębnić datę, obrazy, metadane, tytuł i opis, możesz użyć mojego modułu o nazwie:
.
Zestaw czytelności
źródło
Posługiwać się:
źródło