好的,我放弃...(我现在在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];
这会导致断言不再失败,但仍会产生乱码。
因此,我放弃了ifstream并使用Cocoa方法来读取文件,对此进行了一些修改。经过一番尝试和错误后,我发现结合以上修复方法和以下读取文件的方法实际上可以解决问题
NSString *readString = [NSString stringWithContentsOfFile:[NSString stringWithCString:fileName encoding:NSUTF8StringEncoding] encoding:NSUTF8StringEncoding error:&error];
std::string cc2dxString ([readString cStringUsingEncoding:NSISOLatin1StringEncoding]);
...直到我尝试使用法语文件(包含带重音符号的文件)进行相同的操作,该文件再次产生乱码。
由于此解决方案从一开始就很难看,所以我现在有必要提出以下问题:我做的事情完全错误吗,或者cocos2d-x的CCLabelBMFont实现中确实存在一些固有的缺陷?
最佳答案
事实证明,CCLabelBMFont确实是问题所在。
您可以从其github存储库中获得具有完整UTF-8支持的版本