XML UTF8字符集界限

XML UTF8字符集界限,xml,swift,unicode,utf-8,character-encoding,Xml,Swift,Unicode,Utf 8,Character Encoding,我正在开发一个XML库,以便更全面地了解它的全部内容。我遇到了需要转义和验证XML字符串的情况。环顾四周,人们通常只会提到&以及引号和 仔细研究,我发现了实际的规格: 其中指出: Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] 很好,在有效字符上布局完美。我的问题是UTF-8是8位块(代码单位?),最大值为256位。如果我严格使用UTF-8字符串,那么所有内容都将在

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

仔细研究,我发现了实际的规格: 其中指出:

Char    ::=       #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
很好,在有效字符上布局完美。我的问题是
UTF-8
是8位块(代码单位?),最大值为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?
}
我假设XML规范中的
UTF-16
+?

#xA
#xE000
#x10000
等的上限是(也称为Unicode码点,不包括为UTF-16保留的高代理码点和低代理码点)。这就是枚举字符串视图时得到的结果:

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

    // ....
}
然后可以测试Unicode标量值是否相等:

if value == 0x10000 {

}
或用于范围内的容器:

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

}
或者在switch/case语句中:

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代码单元。

谢谢,这正是我想要的。编写XML规范是为了以Unicode代码点的形式处理数据,而不是任何特定编码的字节,如UTF-8、UTF-16等。如果您有UTF数据,则必须在处理它们之前将其代码单元序列转换为UTF-32代码单元(也称为Unicode代码点)。