C ++: Как прочитать любой файл в std :: string

У меня есть куча txt-файлов, и я хочу прочитать их в std :: string, и некоторые из них имеют кодировку UCS-2, UTF-8. Как читать их в std :: string. Я просто хочу прочитать любой текстовый файл в std :: string. Должен ли я конвертировать их?

5

Решение

То, как они читаются, зависит от того, что поддерживает ваша ОС, и от того, какой язык вы используете.

Если вы просто наивно читаете в файлах, не касаясь вашей локали, и их локаль не соответствует локали, которую использует ваша библиотека std c ++, вы можете столкнуться с трудностями. Подобная проблема для одиночных и многобайтовых наборов символов.

Нет надежного способа определить, какой язык файла находится перед его чтением (метаданные могут быть неправильными), поэтому общая стратегия заключается в том, чтобы сначала попытаться прочитать в наиболее распространенных форматах, а затем повторить попытку с различными форматами. если это не удается (т. е. встречается недопустимый символ). Даже тогда это может быть неоднозначным. Это обманчиво сложная проблема, вы сталкиваетесь с той же проблемой, разбирая HTML с помощью сумасшедших наборов символов.

В общем, доступны два набора функций файлового ввода-вывода, один для многобайтовых наборов символов и один для однобайтовых наборов символов. Однако поддержка этой функции зависит от конкретной платформы, поэтому, если вы используете локализованную английскую ОС без добавления специальных символов, многобайтовые наборы могут не поддерживаться C ++ напрямую без использования внешней библиотеки.

Microsoft определяет нестандартные расширения для cin и cout. Добавляя к ним префикс w, они разделяют потоки по ширине в байтах.

wcout << "儫";

Это работает, как и следовало ожидать, но вам придется #define _UNICODE для его компиляции. В качестве примечания, Windows разделяет многие из своих системных вызовов API на две версии: одна, которая принимает однобайтовую строку, и другая, которая принимает многобайтовую строку. То есть CreateProcessA против CreateProcessW,

Таким образом, чтобы подвести итог, функциональность IO разделена по ширине байта набора символов и локали. Чтобы дать вам более точный ответ на ваш вопрос, мне нужно больше узнать о ваших целях. Взгляните на поддержку локали в C ++, чтобы получить лучшее представление об этом. В частности, функции локали в ios_base, imbue а также getloc, В настоящее время не существует хорошего способа решения этих проблем с широко развернутыми версиями C ++, хотя я понимаю, что эти проблемы были устранены в следующих версиях C ++.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]