CCLabelBMFont, кодировки и специальные символы - PullRequest
0 голосов
/ 12 марта 2012

Хорошо, я сдаюсь ... (сейчас я использую 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?

1 Ответ

1 голос
/ 12 марта 2012

Оказывается, проблема была в CCLabelBMFont.

Вы можете получить версию с полной поддержкой UTF-8 из их репозитория github

...