最近,我一直在使用XML文件作为我正在开发的游戏(使用Cocos2d-X)的本地化系统。我正在使用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
个字符。
答案 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).+ (tap to continue)">
或者你可以在xml中添加一个逐字的换行符。这将是这样的:
<string16 englishstring="(We?[lcom]*e)(to|Regex).+
(tap to continue)">
但并非所有xml解析器都支持,我不知道PugiXML。