哪些 unicode 代码可以安全地用作保留值?

Which unicode code can be used safely as reserved value?

背景

我正在编写基于 DFA 的正则表达式解析器,出于性能原因,我需要使用字典 [Unicode.Scalar : State] 来映射下一个状态。现在我需要一堆特殊的 unicode 值来表示特殊的字符表达式,如 .\w\d...

我的问题

为此目的使用哪些 unicode 值是安全的?

我用 U+0000 代替 .,但我现在需要更多。我检查了 unicode 文档,Noncharacters 似乎很有希望,但在 swift 中,这些被认为是无效的 unicode。例如,下面的代码给我一个编译器错误 Invalid unicode scalar.

let c = "\u{FDD0}"

如果你坚持使用Unicode.Scalar,什么都没有。 Unicode.Scalar 旨在表示 Unicode 中的所有有效字符,包括 尚未分配 代码点。因此,它不能表示 noncharacters 也不能表示悬空代理项("\u{DC00}" 也会导致错误)。

而在 Swift 中,String 可以包含所有有效的 Unicode.Scalar,包括 U+0000。例如 "\u{0000}" (== "[=17=]") 是一个有效的字符串,它的长度 (count) 是 1。使用 U+0000 作为元字符,你的代码不会使用有效的 Swift 字符串。


考虑使用 [UInt32: State] 而不是 [Unicode.Scalar: State]。 Unicode 仅使用 0x0000...0x10FFFF(包括非字符),因此使用大于 0x10FFFF 的值是 安全的(按您的意思)。

同时获得 value 属性 of Unicode.Scalar 的成本非常小,在优化代码中可以忽略其成本。我不确定使用 Dictionary 是否真的是处理您的要求的好方法,但 [UInt32: State] 是否与 [Unicode.Scalar: State].

一样有效