PugiXML C ++换行处理问题:'\ n \ n'变为'\\ n \\ n'

时间:2015-09-27 07:56:05

标签: c++ xml-parsing pugixml

最近,我一直在使用XML文件作为我正在开发的游戏(使用Cocos2d-X)的本地化系统。我正在使用PugiXML来解析XML本地化文件。在解析带有换行符(\n)的英文字符串时,我遇到了一个问题。更准确地说,在XML文件中:

enter image description here

问题在于PugiXML将这些\n\n个字符解析为\\n\\n。以下是调试器的外观:

enter image description here

请注意,系统尝试翻译的字符串是

englishstring (englishstring std::__1::string "(We?[lcom]*e)(to|Regex).+\n\n(tap to continue)")

和pugixml返回的字符串是

engString(engString std::__1::string "(We?[lcom]*e)(to|Regex).+\\n\\n(tap to continue)")

显然比较这两个字符串失败,所以没有任何内容被翻译。另外,Cocos2d-X不会使用\\n绘制换行符,因此将所有换行符设置为也不是一个选项。

我理解这可能是期望的行为,但我的问题是:如何修复/禁用此行为?我已将XML解析模式设置为pugi::parse_minimal,但仍返回\\n个字符。

1 个答案:

答案 0 :(得分:1)

在c ++中,字符串中的反斜杠必须使用另一个反斜杠进行转义。因此,如果文本包含\,则它将以"\\"的形式显示在字符串中,即使它只包含一个反斜杠。

反斜杠后面的字符不会改变它。 xml中的\n只是两个字符,其中一个是反斜杠。因此\n变为"\\n"

您似乎期望xml中有换行符。在这种情况下,您必须使用xml实体
来表示换行符。而不是

<string16 englishstring="(We?[lcom]*e)(to|Regex).+\n\n(tap to continue)">

使用此代替

<string16 englishstring="(We?[lcom]*e)(to|Regex).+&#10;&#10;(tap to continue)">

或者你可以在xml中添加一个逐字的换行符。这将是这样的:

<string16 englishstring="(We?[lcom]*e)(to|Regex).+

(tap to continue)">

但并非所有xml解析器都支持,我不知道PugiXML。