Визуализация UFT-8 (польский) не работает должным образом

Мое программное обеспечение поддерживает несколько языков (английский, немецкий, польский, русский, ...).
По этой причине у меня есть некоторые языковые файлы с диалоговыми текстами на определенном языке (в кодировке UTF-8). В моем приложении mfc я открываю и читаю эти файлы и вставляю текст в мои AfxMessageBoxes и другие UI-Windows.

// Get the codepage number. 65001 = UTF-8
// In the real code this is a parameter in the function I call (just for clarification)
LANGID languageID = 65001;
TCHAR szCodepage[10];
GetLocaleInfo (MAKELCID (languageID, SORT_DEFAULT), LOCALE_IDEFAULTANSICODEPAGE, szCodepage, 10);
int nAnsiCodePage = _ttoi (szCodepage);

// Open the file
CFile file;
CString filename = getName();

if (!file.Open(FileName, CFile::modeRead, NULL))
{
    //Check if everything is fine, else break
}

// Read the file
CString inString;
int len = file.GetLength ();
UINT n = file.Read (inString.GetBuffer(len), len);
inString.ReleaseBuffer ();
int size = MultiByteToWideChar (CP_ACP, 0, strAllItems, -1, NULL, 0);

WCHAR *ubuf = new WCHAR[size + 1]; 
MultiByteToWideChar ((UINT) nAnsiCodePage, (nAnsiCodePage == CP_UTF8 ?
                                     0 : MB_PRECOMPOSED), inString, -1, ubuf, (int) size);

outString = ubuf;
file.Close ();


Результат:

Результат

Этот механизм работает хорошо для специальных букв русского и немецкого языков, но не для польского. Я уже проверил сайт utf-8 ( http://www.utf8-chartable.de/unicode-utf8-table.pl?number=1024) и польские символы являются его частью.
Я также проверил шестнадцатеричные значения моей CString, и все, кажется, в порядке, но это не отображается правильно. Просто для тестирования я изменил используемую кодовую страницу с utf-8 на 1250 (Восточная Европа, включая польский), и она также не работала. Что я делаю неправильно?

РЕДАКТИРОВАТЬ:
Когда я использую:

MultiByteToWideChar (CP_UTF8 , 0, inString, -1, ubuf, (int) size);

Шестнадцатеричные значения сокращаются до букв "наилучшего соответствия". Это означает, что мой результат: mezczyzna

Я использую Windows 7 с выбранным английским языком.

1 ответ

Решение

Ну, у вас есть два варианта:

А. Сделайте ваше приложение Unicode. Вы не говорите нам, так ли это на самом деле, но я пришел к выводу, что это не так. С технической точки зрения это "лучшее" решение, но оно может потребовать больших усилий и даже может оказаться неосуществимым (например, использование не-Unicode-библиотек).

B. Если ваше приложение не поддерживает Unicode, у вас есть некоторые ограничения:
- Ваше приложение сможет корректно отображать только одну кодовую страницу с помощью API и сообщений, не поддерживающих Юникод, и это, к сожалению, нельзя установить для каждого приложения, оно глобально установлено в Windows с опцией "Язык для программ, не поддерживающих Юникод", и требует перезагружать.
- Чтобы правильно отображать строки, содержащие символы, отсутствующие в кодовой странице по умолчанию, вам необходимо преобразовать их в Unicode и явно использовать "широкие" версии API и сообщений для их отображения (например, MessageBoxW()). Немного громоздко, но выполнимо, если операция касается только небольшого количества элементов управления.

Машина, на которой вы работаете, имеет некоторый западноевропейский язык как "Язык для программ, не поддерживающих Юникод", и я пришел к такому выводу, потому что "Этот механизм работает нормально для специальных букв русского и немецкого языков" и "Использование MessageBoxA(0, "mężczyzna", 0, 0) не работает ", как вы сказали (хотя я совсем не уверен в русском, так как это другая кодовая страница).

Помимо этого, как сказал IInspectable, int size = MultiByteToWideChar (CP_ACP, 0, strAllItems, -1, NULL, 0); не имеет никакого смысла, так как известно, что строка UTF-8, а не кодовая страница по умолчанию. Вам также может понадобиться удалить заголовок спецификации UTF-8, если он есть в вашем файле.

Другие вопросы по тегам