Мое программное обеспечение поддерживает несколько языков (английский, немецкий, польский, русский, ...).
По этой причине у меня есть несколько языковых файлов с текстами диалогов на определенном языке (в кодировке UTF-8). В моем приложении mfc я открываю и читаю эти файлы и вставляю текст в свои AfxMessageBoxes и другие окна пользовательского интерфейса.
// 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 с выбранным английским языком.
CString
уже содержит широкие символы (если только вы не компилируете приложение без поддержки Unicode, чего делать не следует), поэтому чтение utf8 в него не сработает. Если вы собираетесь скрыть utf8, вам следует указатьCP_UTF8
в качестве кодовой страницы. Но решением было бы удалить весь этот код и переключиться на ресурсы MUI (многоязычный пользовательский интерфейс), которые будут автоматически загружать соответствующий язык. - person user7860670   schedule 17.04.2018CP_ACP
. Вы знаете, что вводите кодировку UTF-8, так зачем лгать API? Кроме того, передача (потенциально) другой кодовой страницы в вызов, который выполняет фактическое преобразование, является еще одной ошибкой. Если вы используете общую тему для первого вызова API для получения размера буфера результатов, а затем вызываете его во второй раз для выполнения операции, вам необходимо передать одинаковые параметры в обоих вызовах. - person IInspectable   schedule 17.04.2018