Хорошо, я сдаюсь ... (сейчас я использую cocos2d-x в iOS env)
Я создаю игру, в которой мне нужно читать строки (возможно, немецкие, французские и т. Д.) Из текстового файла и отображать их в метках.
Я начал, используя стандартный ifstream для чтения файла, и все отлично работало для чистого английского текста. Однако, когда я попробовал немецкий (содержащий умлауты), приложение перестало работать на
CCAssert( c < kCCBMFontMaxChars, "LabelBMFont: character outside bounds");
c в этом случае может быть равно 65468, что определенно не является символом, который я хочу отобразить.
Поэтому, следуя другому совету, я изменил предыдущую строку в CCLabelBMFont.cpp на
unsigned long c = m_sString[i];
из
короткое без знака c = m_sString [i];
что приводит к тому, что Assert больше не перестает работать, но все равно выдает искаженный вывод.
Так что я немного повозился с отказом от ifstream и использованием методов Какао для чтения файла. После некоторых проб и ошибок я обнаружил, что объединение вышеуказанного исправления со следующим методом чтения файла действительно помогло
NSString *readString = [NSString stringWithContentsOfFile:[NSString stringWithCString:fileName encoding:NSUTF8StringEncoding] encoding:NSUTF8StringEncoding error:&error];
std::string cc2dxString ([readString cStringUsingEncoding:NSISOLatin1StringEncoding]);
... пока я не попробовал то же самое с французским файлом (содержащим символы с акцентом), который снова выдавал искаженный вывод.
Поскольку это решение было уродливым с самого начала, теперь я чувствую необходимость спросить: я делаю это совершенно неправильно или есть какой-то врожденный недостаток в реализации CCLabelBMFont в cocos2d-x?