Проблемы MFC с Unicode и шрифтами в CListCtrl с использованием Windows 7 - PullRequest
0 голосов
/ 22 января 2012

Я разрабатываю приложение на C ++ с использованием MFC, которое должно уметь обрабатывать символы Юникода. Всякий раз, когда я пытаюсь просмотреть символы Unicode в CListCtrl, они всегда отображаются в виде квадратов, но я прекрасно вижу их в CEdit и CRichEdit. Я сохранил список символов, которые я пытался увидеть в файл, используя этот код:

bool CFileIO::writeStringToFile(CString str, CString filepath)
{
    FILE* outFile = _tfopen(filepath, _T("wb"));
    if(outFile == NULL)
    {
        return false;
    }

#ifdef _UNICODE
    int markerBits = 0xFEFF;
    fwrite(&markerBits, 2, 1, outFile);
#endif
    fwrite(str.GetBuffer(), sizeof(TCHAR), str.GetLength(), outFile);
    fclose(outFile);

    return true;
}

где _UNICODE определен, а CString - это просто список символов, разделенных символами новой строки. Когда я открыл этот файл в Notepad ++, я не смог просмотреть символы Unicode (они отображались в виде квадратов), но символы, которые также были символами ASCII, отображались очень хорошо (это то же поведение, которое я получал от CListCtrl). Так как я смог скопировать и вставить квадраты в строку поиска Google Chrome, и они бы там правильно отображались, я решил, что Notepad ++ должен правильно читать символы, просто не мог их отобразить. После некоторого перерыва в работе в Интернете я подумал, что проблема может быть связана со шрифтом, поэтому в Notepad ++ я изменил шрифт на Arial Unicode MS и вуаля! Это сработало! Я мог видеть все символы Unicode (и символы ASCII) просто отлично.

Поэтому я решил изменить шрифт моего CListCtrl на Arial Unicode MS, чтобы посмотреть, решит ли это проблему (поскольку это работает для Notepad ++), но у меня были сомнения, поскольку все мои CListCtrl и CEdit / CRichEdit используют одинаково шрифт. Как я и опасался, изменение шрифта не изменило символы Юникода из квадратов (теперь они были просто немного другими квадратами).

Вот кикер: я работаю на Windows 7, и мой клиент использует Windows XP. Он говорит, что у него никогда не было проблем, которые я описывал. Итак, я установил виртуальную машину XP на своем компьютере, и она работает нормально. Единственное различие между XP и 7 в отношении Unicode, о котором я могу подумать, заключается в том, что в XP вы должны явно включить Unicode (и я думаю, что установите некоторый дополнительный контент), тогда как в версии 7 он должен быть включен по умолчанию.

И последнее: когда я сказал, что это работает в XP, это было не совсем точно. Несмотря на то, что большинство символов Unicode отображаются правильно, некоторые из них все еще отображаются в виде квадратов в CListCtrl (но в Notepad ++ в XP и в 7 они отображаются правильно). Я распечатал их значения без знака, чтобы посмотреть, не переполняют ли они переменную TCHAR или что-то в этом роде. Все они имели значения в диапазоне 8212-8226 (не обязательно всесторонний, только диапазон, который я пытался напечатать). Я понятия не имею, почему они не появляются.

Я довольно долго искал в интернете, и я понятия не имею, что здесь происходит. Единственное, о чем я могу подумать, это то, что у меня может быть проблема, аналогичная той, которая у меня возникла с CRichEdit некоторое время назад (они также не отображали символы Юникода в виде чего-либо, кроме квадратов, поэтому мне пришлось зайти в файл .rc и изменить управление от "RichEdit" до "RichEdit20W"). Но я не смог найти ничего связанного с этим для CListCtrl. Кто-нибудь имеет представление о MFC и о том, как он работает с Unicode, что может указывать мне правильное направление?

ОБНОВЛЕНИЕ: Следуя совету DavidK (в комментариях ниже), я создал тестовое приложение MFC, которое представляло собой просто диалог с CListCtrl. После запуска он читал в вышеупомянутом файле со смесью символов Unicode и ASCII, и все отображалось правильно (без полей). Я вернулся и запустил оригинальную программу, и все почти работало правильно (символы, которые не отображались в XP, также отображались как черные ящики, но все остальное показывалось правильно). Я скопировал программу на отдельную машину с Windows 7 (не на мою машину для разработки) и запустил ее. У меня была та же проблема, что и раньше (все символы Unicode в CListCtrl были блоками). Я должен отметить, что тестовое приложение находится в том же решении, что и основной проект, хотя я не уверен, что это имеет значение.

Я скопировал тестовое приложение на мою машину, не предназначенную для разработки, и когда я запустил его, оно отображало поля для всех символов Unicode, так же, как и основная программа на этом компьютере.Я довольно смущен.Я могу только предположить, что приложения ссылаются на разные библиотеки DLL на разных машинах и / или есть какая-то проблема со шрифтами на машинах.

...