SwiftUI 文本视图不显示不可显示的字符

Posted

技术标签:

【中文标题】SwiftUI 文本视图不显示不可显示的字符【英文标题】:SwiftUI Text View does not show non-displayable characters 【发布时间】: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\u11\0\u11\0\u11\0\u11\0\u11"

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

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

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

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

【问题讨论】:

【参考方案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\u11\0\u11\0\u11\0\u11\0\u11"
print(str.asciiEscaped)

这将打印:

\0\u11\0\u11\0\u11\0\u11\0\u11

【讨论】:

谢谢!我想在某个地方有一个简单的函数,但从没想过在 Unicode.Scalar 下查看。

以上是关于SwiftUI 文本视图不显示不可显示的字符的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 显示标签/文本中剩余的字符数

SwiftUI ObservedObject 不更新父视图

SwiftUI - 在 Digital Crown 旋转期间显示视图

SwiftUI中Section视图里的文本全部变成大写显示的解决

SwiftUI中Section视图里的文本全部变成大写显示的解决

Swift UI:当视图中显示空列表时,如何显示错误消息?