为什么在加载 XML 文件时 Qt 会丢失我的细空间 unicode 字符?

xio*_*xox 5 xml unicode qt

我有一个 XML 文档,其中一部分包含以下内容:

<math display='block'><mtext>&#x2009;</mtext></math>
Run Code Online (Sandbox Code Playgroud)

如果将其加载到 Qt(特别是我发现此问题的 Qt MathML 小部件)中,QDomDocument 对象将丢失 unicode 细空格字符 (U+2009)。这个 Python 示例代码演示了这个问题:

from PyQt4.QtXml import *

d = QDomDocument()
d.setContent("<math display='block'><mtext>&#x2009;</mtext></math>")
print repr(unicode(d.toString()))
Run Code Online (Sandbox Code Playgroud)

这段代码的输出是:

u'<math display="block">\n <mtext/>\n</math>\n'
Run Code Online (Sandbox Code Playgroud)

在细空格后插入一个额外的非空格字符会阻止细空格丢失。

这是我的错误、XML 功能还是 Qt 有错误?

小智 5

QDomDocument 的文档

仅由空格组成的文本节点将被剥离并且不会出现在 QDomDocument 中。如果不需要这种行为,可以使用允许提供 QXmlReader 的 setContent() 重载。

所以这样你就不会丢失空白数据(示例在 C++ 中):

QXmlSimpleReader reader;
QXmlInputSource source;
QDomDocument dom;

source.setData(QString("<mtext>&#x2009;</mtext>"));
dom.setContent(&source, &reader);
Run Code Online (Sandbox Code Playgroud)

  • 好吧,QDomDocument 将那个细空格字符作为一个空格而不是根据 XML 规范来处理。而且 QDomDocument 似乎不支持 xml:space 属性。所以 xioxox 可以[制作错误报告](https://bugreports.qt-project.org/secure/Dashboard.jspa)。在等待修复时,使用 QXmlReader 的 `setContent()` 工作。 (2认同)