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 - 在 Digital Crown 旋转期间显示视图
SwiftUI中Section视图里的文本全部变成大写显示的解决