【问题标题】:PugiXML C++ Newline handling issue: '\n\n' becomes '\\n\\n'PugiXML C++ 换行处理问题:'\n\n' 变为 '\\n\\n'
【发布时间】:2015-12-24 16:17:00
【问题描述】:

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

问题在于 PugiXML 将这些 \n\n 字符解析为 \\n\\n。这是它在调试器上的样子:

注意系统试图翻译的字符串是

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 字符。

【问题讨论】:

    标签: c++ xml-parsing pugixml


    【解决方案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。

    【讨论】:

    • 谢谢,这正是我所需要的。详细地说,在 XML 中添加换行符实际上并没有对 PugiXML 做任何事情,但是 似乎工作得很好,正是我所需要的。我还想指出,PugiXML 需要它的默认解析选项才能工作,这意味着使用 pugi::parse_minimal 不会转换 到\n。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-22
    • 2018-10-08
    • 1970-01-01
    相关资源
    最近更新 更多