【问题标题】:How does the UTF-8 support of TinyXML work?TinyXML 的 UTF-8 支持如何工作?
【发布时间】:2010-09-13 21:31:00
【问题描述】:

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

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

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

【问题讨论】:

    标签: c++ unicode utf-8 tinyxml


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        首先,正如@quinmars 所说,utf-8 存储在 const char * 字符串中。而且它不仅是 7 位 ASCII 的超集(代码点 = 128。因此,如果您看到一个字节 == 44,它就是一个“

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

        【讨论】:

        • 好的,谢谢,它越来越清楚了,但是仍然 - 使用 std::string 以这种方式表示 UTF-8 数据,这在语义上不是错误的吗?您将永远无法依赖该字符串的内容——甚至无法知道它有多长! (按字符长度)。
        • 即使是 const char* 版本,您仍然必须使用另一个库来可靠地处理字符串。
        • 未定义多于错误。 std::string 的方法(连接、迭代器切片、find_* 等)仍然有效。无论如何,length() 只定义为 == size()。有一个新的前提条件是偏移量位于 char 边界处。如果 std::string 对编码做出任何承诺,那将是错误的,但事实并非如此。
        猜你喜欢
        • 1970-01-01
        • 2018-08-07
        • 2021-08-01
        • 2010-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-03
        相关资源
        最近更新 更多