gpt4 book ai didi

XML UTF8 字符集范围

转载 作者:行者123 更新时间:2023-11-30 12:29:33 25 4
gpt4 key购买 nike

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

深入挖掘后我发现了实际的规范:https://www.w3.org/TR/REC-xml/#charsets其中指出:

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

太棒了,完美地布局了有效字符。我的问题是UTF-8是 8 位 block (代码单元?),其最大十进制值为 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 Scalar Values (又名 Unicode 代码点,不包括为 UTF-16 保留的高代理和低代理代码点)。这就是枚举 unicodeScalars 时得到的结果。字符串 View :

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 View 时:

for char in someString.utf8 { }

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

关于XML UTF8 字符集范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43737221/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com