XML UTF8 字符集边界



我正在开发一个XML库,以更全面地了解它的全部内容。我遇到了需要转义和验证 XML 字符串的问题。环顾四周,人们通常只会提到&和引号和<,>

四处挖掘我找到了实际规格:https://www.w3.org/TR/REC-xml/#charsets 其中指出:

Char    ::=       #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]

太好了,完美地布置在有效字符上。我的问题是UTF-88 位块(代码单元?)在十进制值 256 时最大值。如果我严格使用字符串UTF-8则所有内容都将在#xD7FF范围内,而在最终范围内没有任何内容。

在我看来,使用UTF-8对上限进行边界检查是没有意义的,我知道字符集/unicode 可能充满了陷阱,我错过了什么吗?

例如,我正在使用 Swift。所以如果我去

let someString = "abcdefg"
for char in someString.utf8 {
//  char is a UTF8.CodeUnit which is a type alias to UInt8, 
//  comparing a UInt8 to a value of something over 256 is just silly?
}

我假设这些上限是针对UTF-16+?

XML规范中的#xA#xE000#x10000等是Unicode标量值(又名Unicode代码点,不包括为UTF-16保留的高代理项和低代理项代码点)。 这就是枚举字符串的unicodeScalars视图时得到的:

for unicode in someString.unicodeScalars {
let value = unicode.value // an `UInt32`
// ....
}

然后,您可以测试 Unicode 标量值的相等性:

if value == 0x10000 {
}

或者对于一定范围内的遏制:

if 0xE000...0xFFFD ~= value {
}

或者在开关/案例语句中:

switch value {
case 0x0A, 0x0D:
// ...
case 0xE000...0xFFFD:
// ...
default:
// ...
}

枚举utf8视图时:

for char in someString.utf8 { }

您将获得一系列 UTF-8 代码单元 (UInt8) 在 范围内 0 ...255,每个 Unicode 标量值由 1、2、3 表示 或 4 个 UTF-8 代码单元。

最新更新