c++ - CCLabelBMFont、编码和特殊字符

标签 c++ cocos2d-x

好吧,我放弃了...(我现在在 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 实现中实际上存在一些固有缺陷?

最佳答案

事实证明,CCLabelBMFont 确实是问题所在。

您可以从他们的 github 存储库中获得具有完整 UTF-8 支持的版本

关于c++ - CCLabelBMFont、编码和特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9663646/

相关文章:

可迭代类的 C++ 函数重载

c++ - 更改方法的保护级别是否被认为是好的做法?

c++ - 静态成员是继承的吗?

c++ - 是否可以将 native UI 带入 Cocos2dx

cocos2d-x - 如何用cocos2d-x检测双击

c++ - 将 CCPoint 添加到 CCArray

c++ - 由于 undefined reference ,无法链接 Crypto++ Speck 算法

c++ - 保留有关访问状态的信息的想法

c++ - 在 Cocos2dx 中协调多个 Sprite 动画

ios - 按下按钮连续增加标签值