У меня есть куча txt-файлов, и я хочу прочитать их в std :: string, и некоторые из них имеют кодировку UCS-2, UTF-8. Как читать их в std :: string. Я просто хочу прочитать любой текстовый файл в std :: string. Должен ли я конвертировать их?
То, как они читаются, зависит от того, что поддерживает ваша ОС, и от того, какой язык вы используете.
Если вы просто наивно читаете в файлах, не касаясь вашей локали, и их локаль не соответствует локали, которую использует ваша библиотека std c ++, вы можете столкнуться с трудностями. Подобная проблема для одиночных и многобайтовых наборов символов.
Нет надежного способа определить, какой язык файла находится перед его чтением (метаданные могут быть неправильными), поэтому общая стратегия заключается в том, чтобы сначала попытаться прочитать в наиболее распространенных форматах, а затем повторить попытку с различными форматами. если это не удается (т. е. встречается недопустимый символ). Даже тогда это может быть неоднозначным. Это обманчиво сложная проблема, вы сталкиваетесь с той же проблемой, разбирая HTML с помощью сумасшедших наборов символов.
В общем, доступны два набора функций файлового ввода-вывода, один для многобайтовых наборов символов и один для однобайтовых наборов символов. Однако поддержка этой функции зависит от конкретной платформы, поэтому, если вы используете локализованную английскую ОС без добавления специальных символов, многобайтовые наборы могут не поддерживаться C ++ напрямую без использования внешней библиотеки.
Microsoft определяет нестандартные расширения для cin и cout. Добавляя к ним префикс w, они разделяют потоки по ширине в байтах.
wcout << "儫";
Это работает, как и следовало ожидать, но вам придется #define _UNICODE
для его компиляции. В качестве примечания, Windows разделяет многие из своих системных вызовов API на две версии: одна, которая принимает однобайтовую строку, и другая, которая принимает многобайтовую строку. То есть CreateProcessA
против CreateProcessW
,
Таким образом, чтобы подвести итог, функциональность IO разделена по ширине байта набора символов и локали. Чтобы дать вам более точный ответ на ваш вопрос, мне нужно больше узнать о ваших целях. Взгляните на поддержку локали в C ++, чтобы получить лучшее представление об этом. В частности, функции локали в ios_base
, imbue
а также getloc
, В настоящее время не существует хорошего способа решения этих проблем с широко развернутыми версиями C ++, хотя я понимаю, что эти проблемы были устранены в следующих версиях C ++.
Других решений пока нет …