当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《TinyXML的UTF-8支持如何工作?》经验,为你挑选了1个好方法。

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

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

(我可能在这里混淆了一些Unicode术语;对于任何来自此的混淆感到抱歉).



1> puetzk..:

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


更多不确定而不是错误.std :: string的方法(连接,迭代器切片,find_*等)仍然有效.无论如何,length()仅定义为== size().有一个新的先决条件,抵消在char边界.如果std :: string做出任何关于编码的承诺,那就错了,但事实并非如此.
推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有