12

我正在使用TinyXML来解析/构建 XML 文件。现在,根据文档,该库通过 UTF-8 支持多字节字符集。到目前为止,我认为很好。但是,该库提供的唯一 API(用于获取/设置元素名称、属性名称和值,......使用字符串的所有内容)是通过std::stringor const char*。这让我怀疑自己对多字节字符集支持的理解。仅支持 8 位字符的字符串如何包含 16 位字符(除非它使用代码页,否则会否定“支持 Unicode”声明)?我了解您理论上可以采用 16 位代码点并将其拆分为 a 中的 2 个字符std::string,但这不会改变std::string对于“Unicode”字符串,它会使其在大多数用途中无效,并且在写入文件并被另一个程序读入时可能会意外工作。

那么,有人可以向我解释一个库如何提供“8 位接口”(std::stringconst char*)并且仍然支持“Unicode”字符串吗?

(我可能在这里混淆了一些 Unicode 术语;对于由此产生的任何混淆,我深表歉意)。

4

3 回答 3

8

首先,正如@quinmars 所说,utf-8 存储在 const char * 字符串中。而且它不仅是 7 位 ASCII 的超集(代码点 <= 127 总是像它们自己一样在单个字节中编码),而且还要小心的是,具有这些值的字节永远不会用作代码点的多字节值编码的一部分>= 128。因此,如果您看到一个字节 == 44,它是一个“<”字符等。XML 中的所有元字符都是 7 位 ASCII 格式。因此,可以只解析 XML,在元字符所说的地方分解字符串,将片段(可能包括非 ASCII 字符)粘贴到 char * 或 std::string 中,并且返回的片段仍然是有效的 UTF-8 字符串,即使解析器并不特别了解 UTF-8。

此外(不是特定于 XML,而是相当聪明),更复杂的事情通常也能正常工作(tm)。例如,如果您按字节按字典顺序对 UTF-8 进行排序,您会得到与按代码点按字典顺序排序相同的答案,尽管使用的字节数有所不同,因为前缀字节引入了更长(因此价值更高)的代码点在数值上大于较小值的点)。

于 2008-09-28T23:49:50.633 回答
2

UTF-8 与 7 位 ASCII 码兼容。如果一个字节的值大于 127,这意味着一个多字节字符开始。根据第一个字节的值,您可以看到字符将占用多少字节,包括第一个字节在内可能是 2-4 个字节(技术上也可以是 5 或 6 个字节,但它们不是有效的 utf-8)。这是关于 UTF-8 的一个很好的资源:UTF-8 和 Unicode 常见问题解答,utf8 的 wiki 页面也提供了非常丰富的信息。由于 UTF-8 是基于字符且以 0 结尾的,因此您可以在大多数情况下使用标准字符串函数。唯一重要的是字符数可能与字节数不同。strlen() 之类的函数返回字节数,但不一定返回字符数。

于 2008-09-28T22:56:13.323 回答
0

通过使用 1 到 4 个字符来编码一个 Unicode 代码点。

于 2008-09-28T23:43:08.357 回答