How do I decode HTML entities in Swift?

后端 未结 23 1909
一生所求
一生所求 2020-11-22 01:47

I am pulling a JSON file from a site and one of the strings received is:

The Weeknd ‘King Of The Fall&         


        
相关标签:
23条回答
  • 2020-11-22 02:24

    Swift 5.1 Version

    import UIKit
    
    extension String {
    
        init(htmlEncodedString: String) {
            self.init()
            guard let encodedData = htmlEncodedString.data(using: .utf8) else {
                self = htmlEncodedString
                return
            }
    
            let attributedOptions: [NSAttributedString.DocumentReadingOptionKey : Any] = [
                .documentType: NSAttributedString.DocumentType.html,
                .characterEncoding: String.Encoding.utf8.rawValue
            ]
    
            do {
                let attributedString = try NSAttributedString(data: encodedData, options: attributedOptions, documentAttributes: nil)
                self = attributedString.string
            } 
            catch {
                print("Error: \(error)")
                self = htmlEncodedString
            }
        }
    }
    

    Also, if you want to extract date, images, metadata, title and description, you can use my pod named:

    .

    Readability kit

    0 讨论(0)
  • 2020-11-22 02:25

    Swift 4

    I really like the solution using documentAttributes. However, it is may too slow for parsing files and/or usage in table view cells. I can't believe that Apple does not provide a decent solution for this.

    As a workaround, I found this String Extension on GitHub which works perfectly and is fast for decoding.

    So for situations in which the given answer is to slow, see the solution suggest in this link: https://gist.github.com/mwaterfall/25b4a6a06dc3309d9555

    Note: it does not parse HTML tags.

    0 讨论(0)
  • 2020-11-22 02:33

    Swift 2 version of @akashivskyy's extension,

     extension String {
         init(htmlEncodedString: String) {
             if let encodedData = htmlEncodedString.dataUsingEncoding(NSUTF8StringEncoding){
                 let attributedOptions : [String: AnyObject] = [
                NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType,
                NSCharacterEncodingDocumentAttribute: NSUTF8StringEncoding
            ]
    
                 do{
                     if let attributedString:NSAttributedString = try NSAttributedString(data: encodedData, options: attributedOptions, documentAttributes: nil){
                         self.init(attributedString.string)
                     }else{
                         print("error")
                         self.init(htmlEncodedString)     //Returning actual string if there is an error
                     }
                 }catch{
                     print("error: \(error)")
                     self.init(htmlEncodedString)     //Returning actual string if there is an error
                 }
    
             }else{
                 self.init(htmlEncodedString)     //Returning actual string if there is an error
             }
         }
     }
    
    0 讨论(0)
  • 2020-11-22 02:34

    Elegant Swift 4 Solution

    If you want a string,

    myString = String(htmlString: encodedString)
    

    add this extension to your project:

    extension String {
    
        init(htmlString: String) {
            self.init()
            guard let encodedData = htmlString.data(using: .utf8) else {
                self = htmlString
                return
            }
    
            let attributedOptions: [NSAttributedString.DocumentReadingOptionKey : Any] = [
               .documentType: NSAttributedString.DocumentType.html,
               .characterEncoding: String.Encoding.utf8.rawValue
            ]
    
            do {
                let attributedString = try NSAttributedString(data: encodedData,
                                                              options: attributedOptions,
                                                              documentAttributes: nil)
                self = attributedString.string
            } catch {
                print("Error: \(error.localizedDescription)")
                self = htmlString
            }
        }
    }
    

    If you want an NSAttributedString with bold, italic, links, etc.,

    textField.attributedText = try? NSAttributedString(htmlString: encodedString)
    

    add this extension to your project:

    extension NSAttributedString {
    
        convenience init(htmlString html: String) throws {
            try self.init(data: Data(html.utf8), options: [
                .documentType: NSAttributedString.DocumentType.html,
                .characterEncoding: String.Encoding.utf8.rawValue
                ], documentAttributes: nil)
        }
    
    }
    
    0 讨论(0)
  • 2020-11-22 02:34

    Swift 4

    func decodeHTML(string: String) -> String? {
    
        var decodedString: String?
    
        if let encodedData = string.data(using: .utf8) {
            let attributedOptions: [NSAttributedString.DocumentReadingOptionKey : Any] = [
                .documentType: NSAttributedString.DocumentType.html,
                .characterEncoding: String.Encoding.utf8.rawValue
            ]
    
            do {
                decodedString = try NSAttributedString(data: encodedData, options: attributedOptions, documentAttributes: nil).string
            } catch {
                print("\(error.localizedDescription)")
            }
        }
    
        return decodedString
    }
    
    0 讨论(0)
  • 2020-11-22 02:39

    Swift 4

    extension String {
    
        mutating func toHtmlEncodedString() {
            guard let encodedData = self.data(using: .utf8) else {
                return
            }
    
            let attributedOptions: [NSAttributedString.DocumentReadingOptionKey : Any] = [
                NSAttributedString.DocumentReadingOptionKey(rawValue: NSAttributedString.DocumentAttributeKey.documentType.rawValue): NSAttributedString.DocumentType.html,
                NSAttributedString.DocumentReadingOptionKey(rawValue: NSAttributedString.DocumentAttributeKey.characterEncoding.rawValue): String.Encoding.utf8.rawValue
            ]
    
            do {
                let attributedString = try NSAttributedString(data: encodedData, options: attributedOptions, documentAttributes: nil)
                self = attributedString.string
            }
            catch {
                print("Error: \(error)")
            }
        }
    
    0 讨论(0)
提交回复
热议问题