2012-03-12 6 views
0

Хорошо, я сдаемся ... (Я использую cocos2d-й в окр IOS сейчас)CCLabelBMFont, кодировки и специальные символы

Я строй игры, где я должен читать строки (потенциально немецкими , Французский и т. Д.) Из текстового файла и отображать их в ярлыках.

Я начал, используя стандартный ifstream, чтобы прочитать файл, и все отлично работало для чистого текста на английском языке. Когда я попробовал немецкий (содержащие умляуты), однако, приложение не будет работать на

CCAssert(c < kCCBMFontMaxChars, "LabelBMFont: character outside bounds"); 

с в этом случае может равняться 65468, который, безусловно, не символ, я хочу, чтобы отобразить.

Так следуя другой намек я изменил предыдущую линию в CCLabelBMFont.cpp к

unsigned long c = m_sString[i]; 

от беззнаковых коротких с = 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?

ответ

1

Выключается, CCLabelBMFont действительно была проблемой.

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

+0

GitHub Как бы я заменить, если тест так: 'для (NSUInteger я = 0; я <[длина м]; я ++) { \t \t unichar c = [m characterAtIndex: i]; \t \t, если (с> = kCCBMFontMaxChars) { \t \t \t м = [м stringByReplacingCharactersInRange: NSMakeRange (я, 1) withString: @ "'"]; \t \t} \t} ' – marciokoko

+0

Извините, но я понятия не имею, что вы пытаетесь задать здесь. Сейчас вы заменяете неподдерживаемые символы апострофами. Что ты хочешь делать? – fleshgolem

+0

kCCBMFontMaxChars возвращает предупреждение в cocos2d версии 2.0. я думаю, что это было устарело. так как я могу заменить его в этом случае, если тест? – marciokoko