将字符串编码为HTML字符串 Swift 3

6

如何在Swift中对字符串进行编码以删除所有特殊字符并将其替换为相应的HTML数字。

假设我有以下字符串:

var mystring = "This is my String & That's it."

然后使用其HTML编号替换特殊字符

& = &
' = '
> = >

但我希望对所有特殊字符进行此操作,而不仅仅是上面字符串中列出的字符。如何做到这一点?

5个回答

6
extension String {
    func makeHTMLfriendly() -> String {
        var finalString = ""
        for char in self {
            for scalar in String(char).unicodeScalars {
                finalString.append("&#\(scalar.value)")
            }
        }
        return finalString
    }
}

使用方法:

newString = oldString.makeHTMLfriendly()

总的来说,这似乎是有效的(尽管我不确定Unicode标量是否始终与HTML数字匹配)。

请注意,它会将所有东西转换,包括那些实际上不需要转换的字母数字字符。也许可以轻松地编辑它以避免转换一些内容。


2
尝试使用SwiftSoup
func testEscape()throws {
    let text = "Hello &<> Å å π 新 there ¾ © »"

    let escapedAscii = Entities.escape(text, OutputSettings().encoder(String.Encoding.ascii).escapeMode(Entities.EscapeMode.base))
    let escapedAsciiFull = Entities.escape(text, OutputSettings().charset(String.Encoding.ascii).escapeMode(Entities.EscapeMode.extended))
    let escapedAsciiXhtml = Entities.escape(text, OutputSettings().charset(String.Encoding.ascii).escapeMode(Entities.EscapeMode.xhtml))
    let escapedUtfFull = Entities.escape(text, OutputSettings().charset(String.Encoding.utf8).escapeMode(Entities.EscapeMode.extended))
    let escapedUtfMin = Entities.escape(text, OutputSettings().charset(String.Encoding.utf8).escapeMode(Entities.EscapeMode.xhtml))

    XCTAssertEqual("Hello &amp;&lt;&gt; &Aring; &aring; &#x3c0; &#x65b0; there &frac34; &copy; &raquo;", escapedAscii)
    XCTAssertEqual("Hello &amp;&lt;&gt; &angst; &aring; &pi; &#x65b0; there &frac34; &copy; &raquo;", escapedAsciiFull)
    XCTAssertEqual("Hello &amp;&lt;&gt; &#xc5; &#xe5; &#x3c0; &#x65b0; there &#xbe; &#xa9; &#xbb;", escapedAsciiXhtml)
    XCTAssertEqual("Hello &amp;&lt;&gt; Å å π 新 there ¾ © »", escapedUtfFull)
    XCTAssertEqual("Hello &amp;&lt;&gt; Å å π 新 there ¾ © »", escapedUtfMin)
    // odd that it's defined as aring in base but angst in full

    // round trip
    XCTAssertEqual(text, try Entities.unescape(escapedAscii))
    XCTAssertEqual(text, try Entities.unescape(escapedAsciiFull))
    XCTAssertEqual(text, try Entities.unescape(escapedAsciiXhtml))
    XCTAssertEqual(text, try Entities.unescape(escapedUtfFull))
    XCTAssertEqual(text, try Entities.unescape(escapedUtfMin))
}

我是一位长期使用SwiftSoup的用户,我需要设置元素的文本,而不允许插入HTML,因此我去查看了文档以寻找这种行为,但认为在SwiftSoup中不存在。然后我在谷歌上搜索并找到了这个答案 :) - aehlke
@aehlke 如果你需要帮助,请给我发送一封邮件。 - Scinfu
我现在很好,但建议将此添加到您的文档中!感谢您提供了这个对我的应用程序至关重要的精彩库。 - aehlke

1

为了更多的变化:

extension String {
    var htmlCompatibleDecimalEncoded: String {
        self.unicodeScalars.reduce(into: "") { partialResult, scalar in
            partialResult.append(
                scalar.properties.isPatternSyntax ? "&#\(scalar.value)" : .init(scalar)
            )
            // For percent encoded hex-replacements we could use this:
            // "%\(String(scalar.value, radix: 16, uppercase: true))"
            // But there is a more convenient method for that.
        }
    }
    
    func htmlCompatiblePercentEncoded(allowing allowedCharacters: CharacterSet = []) -> String {
        self.addingPercentEncoding(withAllowedCharacters: allowedCharacters) ?? self
    }
}

let my: String = #"This is my "String" & That's it / <or is it?>"#

my.htmlCompatibleDecimalEncoded                                 // "This is my &#34String&#34 &#38 That&#39s it &#47 &#60or is it&#63&#62"
my.htmlCompatiblePercentEncoded(allowing: .urlQueryAllowed)     // "This%20is%20my%20%22String%22%20&%20That's%20it%20/%20%3Cor%20is%20it?%3E"
my.htmlCompatiblePercentEncoded()                               // "%54%68%69%73%20%69%73%20%6D%79%20%22%53%74%72%69%6E%67%22%20%26%20%54%68%61%74%27%73%20%69%74%20%2F%20%3C%6F%72%20%69%73%20%69%74%3F%3E"
let allowed: CharacterSet = .whitespaces.union(.alphanumerics)
my.htmlCompatiblePercentEncoded(allowing: allowed)              // "This is my %22String%22 %26 That%27s it %2F %3Cor is it%3F%3E"


-1
这是最简单的方法: let encodedValue = yourValue.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)

-1

检查HTML中的所有特殊字符:

http://www.ascii.cl/htmlcodes.htm

你可以创建一个用于解析字符的工具:
像这样:
import UIKit

类Util:NSObject {

func parseSpecialStrToHtmlStr(oriStr: String) -> String {

        var returnStr: String = oriStr


        returnStr = returnStr.replacingOccurrences(of: "&", with: "&#38")
        returnStr = returnStr.replacingOccurrences(of: "'", with: "&#39")
        returnStr = returnStr.replacingOccurrences(of: ">", with: "&#62")
        ...


        return returnStr
    }
}

自己动手,打造属于自己的功能设备。


编辑

如果您认为这是一项巨大的工作,请查看此链接:https://github.com/adela-chang/StringExtensionHTML


1
这就是我最初所做的,似乎必须有一种更简单的方法来完成这个任务。 - user2423476

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接