C ++ UTF-8 / ASCII в UTF-16 в MFC - PullRequest
       71

C ++ UTF-8 / ASCII в UTF-16 в MFC

0 голосов
/ 29 сентября 2019

Как я могу преобразовать (текстовый) файл из UTF-8 / ASCII в UTF-16, прежде чем он будет отображаться в программе MFC?Поскольку MFC использует 16 бит на символ, а большинство (текстовых) файлов в Windows используют UTF-8 или ASCII.

Ответы [ 2 ]

1 голос
/ 30 сентября 2019

На самом деле, вы можете сделать это очень просто, используя классы CStdioFile и CString, предоставляемые MFC.Библиотека MFC является очень мощной и всеобъемлющей (несмотря на некоторые серьезные странности и даже ошибки);но, если вы уже используете его, используйте его в полном объеме:

...
const wchar_t* inpPath = L"<path>\\InpFile.txt"; // These values are given just...
const wchar_t* outPath = L"<path>\\outFile.txt"; // ... for illustrative purposes!
CStdioFile inpFile(inpPath, CFile::modeRead | CFile::typeText);
CStdioFile outFile(outPath, CFile::modeWrite | CFile::modeCreate | CFile::typeText
    | CFile::typeUnicode); // Note the Unicode flag - will create UTF-16LE file!
CString textBuff;
while (inpFile.ReadString(textBuff)) {
    outFile.WriteString(textBuff);
    outFile.WriteString(L"\n");
}
inpFile.Close();
outFile.Close();
...

Конечно, вам нужно будет немного изменить код, если вы хотите, чтобы входные и выходные файлыиметь тот же путь, но это не означало бы изменение основной предпосылки!

При таком подходе не нужно заботиться о каких-либо вызовах библиотеки для преобразования строк символов - просто позвольте MFC сделать это за вас, когдаон читает / записывает (Unicode) CString объект!

Примечание: скомпилирован и протестирован с MSVC (VS-2019), 64-разрядный, в режиме Unicode.

РЕДАКТИРОВАТЬ: Может быть, я неправильно понял ваш вопрос!Если вы на самом деле не хотите конвертировать файл, а просто отображаете его содержимое, уберите все ссылки в моем коде в outFile и просто выполняйте все с каждым прочитанным объектом textBuffer.Класс CString отвечает за все необходимые преобразования ASCII / UTF-8 / UTF-16LE.

1 голос
/ 29 сентября 2019

Простой ответ называется MultiByteToWideChar и WideCharToMultiByte для выполнения обратного преобразования.Также есть CW2A и CA2W , которые немного проще в использовании.

Однако я настоятельно рекомендую не использовать эти функции напрямую.Вы испытываете боль от ручной обработки символьных буферов с риском создания повреждения памяти или дыр в безопасности.

Гораздо лучше использовать библиотеку, основанную на std :: string и / или итераторах.Например, utf8cpp .Преимущество этого варианта - быть маленьким, только для заголовков и мультиплатформенным.

...