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

时间:2017-08-03 00:35:57

标签: swift unicode

背景

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

我的问题

哪个unicode值可以安全地用于此目的?

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

let c = "\u{FDD0}"

1 个答案:

答案 0 :(得分:1)

如果您坚持使用grand_child,则不执行任何操作。 Unicode.Scalar旨在表示Unicode中的所有有效字符,包括 not-assigned-yet 代码点。因此,它不能代表非字符,也不能代表悬挂的代理(Unicode.Scalar也会导致错误)。

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

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

同样获得0x10FFFF value属性需要非常小的成本,并且在优化代码中可以忽略其成本。我不确定使用Unicode.Scalar确实是处理您的要求的好方法,但Dictionary[UInt32: State]一样有效。