好吧,我放弃了……(我现在在 iOS 环境中使用 cocos2d-x)
我正在构建一个游戏,我必须从文本文件中读取字符串(可能是德语、法语等)并将它们显示在标签中。
我开始使用标准 ifstream 读取文件,对于纯英文文本,一切正常。但是,当我尝试德语(包含变音符号)时,该应用程序失败了
CCAssert( c < kCCBMFontMaxChars, "LabelBMFont: character outside bounds");
c 在这种情况下可能等于 65468,这绝对不是我想要显示的字符。
因此,根据另一个提示,我将 CCLabelBMFont.cpp 中的前一行更改为
unsigned long c = m_sString[i];
从无符号短 c = m_sString[i]; 这会导致 Assert 不再失败,但仍会产生乱码输出。
所以我稍微修改了一下放弃 ifstream 并使用 Cocoa 方法来读取文件。经过一些试验和错误后,我发现将上述修复与以下读取文件的方法相结合实际上可以解决问题
NSString *readString = [NSString stringWithContentsOfFile:[NSString stringWithCString:fileName encoding:NSUTF8StringEncoding] encoding:NSUTF8StringEncoding error:&error];
std::string cc2dxString ([readString cStringUsingEncoding:NSISOLatin1StringEncoding]);
...直到我用法语文件(包含重音字符)尝试了同样的事情,它再次产生了乱码输出。
由于这个解决方案一开始就很难看,我现在觉得有必要问:我这样做是完全错误的还是在 cocos2d-x 的 CCLabelBMFont 实现中实际上存在一些固有缺陷?