2008-09-28 67 views
12

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

因此,可以有人向我解释如何图书馆可以提供一个“8位接口”(std::stringconst char*)和仍然支持“的Unicode”字符串?

(我可能在这里混了一些Unicode的术语;遗憾的任何困惑来自未来)。

回答

8

首先,UTF-8是存储在常量字符*字符串,如@quinmars说。它不仅是7位ASCII的超集(代码点< = 127始终以单个字节自身编码),还要注意带这些值的字节永远不会用作代码点多字节值编码的一部分> = 128.所以如果你看到一个字节== 44,它是一个'<'字符等。XML中的所有元字符都是7位ASCII。因此,人们可以解析XML,将元字符串所在的字符串打破,将碎片(可能包含非ASCII字符)粘贴到char *或std :: string中,并且返回的碎片仍保持有效的UTF-8字符串,即使解析器没有具体了解UTF-8。

而且(不是特定于XML,而是聪明),甚至更复杂的事情genrally只是工作(TM)。例如,如果按字节顺序对UTF-8按字典顺序进行排序,则尽管所用的字节数存在差异,但您可以得到与按字典顺序对代码点进行排序相同的答案,因为前缀字节引入了较长(因此较高值)的代码点在数值上大于较小值的点)。

+0

好,谢谢,它变得更清晰,但随后仍 - 使用的std :: string来表示UTF-8数据的这种方式,是不是语义错了吗?你永远无法依赖该字符串的内容 - 甚至不会有办法知道它是多久! (字符长度)。 – Roel 2008-09-29 06:38:54

2

UTF-8与7位ASCII码兼容。如果一个字节的值大于127,则意味着一个多字节字符开始。根据第一个字节的值,您可以看到字符需要多少个字节,可以是2-4个字节,包括第一个字节(技术也可能是5或6,但它们不是有效的utf-8)。这里有一个关于UTF-8的好资源:UTF-8 and Unicode FAQ,utf8的wiki页面也非常丰富。由于UTF-8是基于字符和0终止的,因此大多数情况下都可以使用标准字符串函数。唯一重要的是字符数可以不同于字节数。像strlen()这样的函数返回字节数,但不一定是字符数。

0

通过使用字符1和4之间,以编码一个Unicode代码点。