代码之家  ›  专栏  ›  技术社区  ›  Roel

TinyXML的UTF-8支持如何工作?

  •  12
  • Roel  · 技术社区  · 16 年前

    我在用 TinyXML 解析/生成XML文件。现在,根据 the documentation 这个库支持通过UTF-8的多字节字符集。到目前为止我认为还不错。但是,库提供的唯一API(用于获取/设置元素名、属性名和值,……所有使用字符串的地方)都是通过的 std::string const char* . 这让我怀疑自己对多字节字符集支持的理解。只支持8位字符的字符串如何包含16位字符(除非它使用代码页,这将否定“支持Unicode”声明)?我知道理论上你可以取一个16位的代码点,在一个 STD::字符串 但这并不能改变 STD::字符串 对于“unicode”字符串,它在大多数情况下都会使其无效,并且在写入文件并被其他程序读取时可能会意外工作。

    那么,有人能给我解释一下图书馆如何提供“8位接口”吗?( STD::字符串 常量字符 )仍然支持“unicode”字符串?

    (我可能在这里混淆了一些Unicode术语;很抱歉由此产生的混淆)。

    3 回复  |  直到 11 年前
        1
  •  8
  •   puetzk    16 年前

    首先,正如@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进行字典排序,则会得到与按代码点对其进行字典排序相同的答案,尽管所使用的字节数有所不同,因为引入较长(因此值较高)代码点的前缀字节在数字上大于较小值的前缀字节。

        2
  •  2
  •   quinmars    16 年前

    UTF-8与7位ASCII码兼容。如果一个字节的值大于127,则表示多字节字符开始。根据第一个字节的值,您可以看到字符将占用多少字节,可以是2-4个字节,包括第一个字节(技术上也可以是5或6个字节,但它们不是有效的UTF-8)。这里有一个关于UTF-8的好资源: UTF-8 and Unicode FAQ 另外,用于utf8的wiki页面信息量很大。由于utf-8是基于字符的,并且以0结尾,所以大多数情况下都可以使用标准字符串函数。唯一重要的是字符计数可以与字节计数不同。strlen()等函数返回字节计数,但不一定返回字符计数。

        3
  •  0
  •   Nemanja Trifunovic    16 年前

    通过使用1到4个字符对一个Unicode码位进行编码。