XML UTF8字符集界限
我正在开发一个XML库,以便更全面地了解它的全部内容。我遇到了需要转义和验证XML字符串的情况。环顾四周,人们通常只会提到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字符串,那么所有内容都将在
&
以及引号和
仔细研究,我发现了实际的规格:
其中指出:
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代码点)。