我正在使用TinyXML来解析/构建XML文件.现在,根据文档,该库通过UTF-8支持多字节字符集.到目前为止,我认为这么好.但是,库提供的唯一API(用于获取/设置元素名称,属性名称和值,...使用字符串的所有内容)是通过std::string
或const char*
.这让我怀疑自己对多字节字符集支持的理解.如何只支持8位字符的字符串包含16位字符(除非它使用代码页,这将否定'支持Unicode'声明)?我理解你理论上可以采用一个16位的代码点并将其分成2个字符std::string
,但这不会改变std::string
对于'Unicode'字符串,它会使其在大多数情况下无效,并且在写入文件并由另一个程序读入时可能会意外地工作.
那么,有人可以向我解释一个库如何提供一个'8位接口'(std::string
或const char*
)并仍然支持'Unicode'字符串?
(我可能在这里混淆了一些Unicode术语;对于任何来自此的混淆感到抱歉).
首先,utf-8存储在const char*字符串中,正如@quinmars所说.而且它不仅是7位ASCII的超集(代码点<= 127总是在单个字节中编码为自身),还要小心的是,带有这些值的字节永远不会被用作代码点的多字节值编码的一部分> = 128.因此,如果您看到一个字节== 44,它是一个'<'字符等.XML中的所有元字符都是7位ASCII.因此,人们可以解析XML,打破metachars所说的字符串,将片段(可能包括非ASCII字符)粘贴到char*或std :: string中,并且返回的片段仍然是有效的UTF-8字符串,即使解析器没有特别知道UTF-8.
进一步(不是特定于XML,而是非常聪明),甚至更复杂的事情也只是工作(tm).例如,如果按字节顺序按字典顺序对UTF-8进行排序,则会得到相同的答案,即按字典顺序对代码点进行排序,尽管所使用的字节数有所不同,因为前缀字节引入了较长(因此值较高)的代码点数在数值上大于较小值的点数.