2015-09-27 154 views
1

最近我一直在为我正在开发的游戏(使用Cocos2d-X)的本地化系统使用XML文件。我正在使用PugiXML来解析XML本地化文件。使用换行符(\n)字符解析英文字符串时遇到问题。把更准确地,在XML文件中:PugiXML C++新行处理问题:' n n'变成'\ n \ n'

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)")

明显地比较这两个str ings失败了,所以没有任何东西被翻译。另外,Cocos2d-X不会画\\n的换行符,因此设置所有换行符也不是一个选项。

我明白这可能是想要的行为,但我的问题是:我该如何修复/禁用此行为?我已经将我的XML解析模式设置为pugi::parse_minimal,但它仍然返回\\n个字符。

回答

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。

+1

谢谢,这正是我所需要的。详细地说,向XML中添加换行符并没有对PugiXML做任何事情,但 似乎工作得很好,正是我所需要的。我还想指出,PugiXML需要它的默认解析选项才能工作,这意味着使用pugi :: parse_minimal不会将 转换为\ n。 –