Как читать текстовый файл UTF-16 в C ++ 17 - PullRequest
2 голосов
/ 23 июня 2019

Я очень плохо знаком с C ++.Я хочу прочитать текстовый файл UTF-16 в C ++ 17 в Visual Studio 2019.

Я пробовал несколько методов в Интернете (включая StackOverflow), но ни один из них не работал, а некоторые из них не 't compile (я думаю, что они поддерживают только старые компиляторы).

Я пытаюсь достичь этого без использования сторонних библиотек.

Это читает текстовый файл, номежду каждой буквой есть несколько странных символов и пробелов.

// open file for reading
std::wifstream istrm(filename, std::ios::binary);
if (!istrm.is_open()) {
    std::cout << "failed to open " << filename << '\n';
}
else {
    std::wstring s;
    std::getline(istrm, s);
    std::wcout << s << std::endl;
}

Затем я нашел несколько решений для этого, используя следующие библиотеки

#include <locale>
#include <codecvt>

// open file for reading
std::wifstream istrm(filename, std::ios::binary);
istrm.imbue(std::locale(istrm.getloc(), new std::codecvt_utf16<wchar_t, 0x10ffff, std::consume_header>));
if (!istrm.is_open()) {
    std::cout << "failed to open " << filename << '\n';
}
else {
    std::wstring s;
    std::getline(istrm, s);
    std::wcout << s << std::endl;
}

На этот раз он даже не скомпилировался, получилследующие ошибки в строке std::codecvt_utf16:

Ошибка C4996 'std :: codecvt_utf16': предупреждение STL4017: std :: wbuffer_convert, std :: wstring_convert и заголовок (содержащий std :: codecvt_mode, std :: codecvt_utf8, std :: codecvt_utf16 и std :: codecvt_utf8_utf16) устарели в C ++ 17.(Шаблон класса std :: codecvt НЕ устарел.) Стандарт C ++ не обеспечивает эквивалентную неотрицательную функциональность;рассмотрите использование MultiByteToWideChar () и WideCharToMultiByte () вместо этого.Вы можете определить _SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING или _SILENCE_ALL_CXX17_DEPRECATION_WARNINGS, чтобы подтвердить, что вы получили это предупреждение.

Я был бы признателен, если бы кто-то мог предоставить решение для этого.

* за 10 * 10 * благодарность

1 Ответ

0 голосов
/ 23 июня 2019

Прежде всего, прочитайте связанные вопросы, такие как Поддерживает ли std :: wstring UTF-16 и UTF-32 в Windows? и Является ли 16-битный wchar_t формально допустимым для представления полного Unicode? .

Если вам нужно просто прочитать / записать строки в виде большого двоичного объекта, для которого вы уже знаете, что кодировка UTF-16, без каких-либо преобразований или манипуляций, и вы находитесь в среде, подобной Visual Studio 2019 в Windows, для которой wchar_t предназначен для хранения UTF-16 , тогда вы можете использовать широкие строки и потоки C ++.

Теперь, если вам нужно выполнить преобразования, поддержать несколько кодировок, выполнить итерации в строках (для некоторых определений итерации) или вообще что-то нетривиальное, вам не повезло, если вы хотите остаться в C ++ 17. Комитет по стандарту C ++ создал рабочую группу по Unicode, так что ожидайте, что в ближайшие годы некоторые улучшения будут в этой области. На данный момент вам нужно будет использовать либо функции Win32, такие как MultiByteToWideChar и WideCharToMultiByte, либо внешнюю библиотеку, такую ​​как International Components for Unicode (ICU) или Boost's Locale.

...