【问题标题】:SwiftUI Text View does not show non-displayable charactersSwiftUI 文本视图不显示不可显示的字符
【发布时间】:2020-03-01 04:27:12
【问题描述】:

我有解析 LLDP(链路层发现协议)帧的 Swift 代码,包括可以任意供应商定义的字段。有时它是一个字符串。有时它是一个任意的数据结构。

以下是我如何获取数据并将其强制转换为 .utf8 编码的字符串。

        let ouiString = String(data: data[data.startIndex + 6 ..< data.startIndex + 2 + tlvLength], encoding: .utf8) ?? ""

这是生成的数据结构(具有关联值的枚举的一部分)。上面的“ouiString”现在位于末尾的“info:String”字段中。

case ouiSpecific(oui: String, subType: Int, info: String)

我是这样生成描述的:

    case .ouiSpecific(let oui, let subType, let info):
        return "OUI \(oui) subType \(subType) \(info)"

这是一个原始数据不是字符串的描述示例。不可显示的字符以我认为可以接受的方式显示。

(lldb) po value.description
"OUI 00:12:0f subType 5 \0\u{11}\0\u{11}\0\u{11}\0\u{11}\0\u{11}"

这是我尝试在 SwiftUI 列表中显示它的方法:

        List(lldp.values, id: \.self) { value in
            Text(value.description)
        }

这是 SwiftUI 中生成的显示图像。包含所有转义的不可显示字符的信息字段不显示。

如何在 SwiftUI 文本视图中显示字段,其中不可显示的字符像“po”输出中一样转义?

【问题讨论】:

    标签: swift swiftui


    【解决方案1】:

    您可以使用Unicode.Scalar方法escaped(asASCII: Bool)将不可打印的字符转换为字符串:

    func escaped(asASCII forceASCII: Bool) -> String
    

    标量值表示通常不可打印的字符或 否则需要转义的用反斜杠转义。

    extension StringProtocol {
        var asciiEscaped: String {
            unicodeScalars.map{$0.escaped(asASCII: true)}.joined()
        }
    }
    

    游乐场测试:

    let str = "\0\u{11}\0\u{11}\0\u{11}\0\u{11}\0\u{11}"
    print(str.asciiEscaped)
    

    这将打印:

    \0\u{11}\0\u{11}\0\u{11}\0\u{11}\0\u{11}

    【讨论】:

    • 谢谢!我想在某个地方有一个简单的函数,但从没想过在 Unicode.Scalar 下查看。
    猜你喜欢
    • 2021-11-20
    • 2020-07-08
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 2014-03-17
    • 1970-01-01
    • 1970-01-01
    • 2020-12-15
    相关资源
    最近更新 更多