Подтвердить что ты не робот

(w) ifstream поддерживает различные кодировки

Когда я читаю текстовый файл для широкой символьной строки (std:: wstring) с использованием wifstream, реализует ли реализация потока разные кодировки, то есть ее можно использовать для чтения, например. ASCII, UTF-8 и UTF-16?

Если нет, что мне делать?

(Мне нужно прочитать весь файл, если это имеет значение)

4b9b3361

Ответ 1

С++ поддерживает кодирование символов с помощью std::locale и фасет std::codecvt. Общая идея состоит в том, что объект locale описывает аспекты системы, которые могут варьироваться от культуры к культуре, (человеческого) языка и языка. Эти аспекты разбиваются на facet s, которые являются аргументами шаблона, которые определяют, как строятся объекты, зависящие от локализации (включая потоки ввода-вывода). Когда вы читаете с istream или записываете в ostream, фактическая запись каждого символа фильтруется через грани местности. Границы охватывают не только кодирование типов Unicode, но и такие разнообразные функции, как то, как большие числа записываются (например, с запятыми или периодами), валютой, временем, капитализацией и множеством других деталей.

Однако только потому, что средства существуют для кодирования, не означает, что стандартная библиотека фактически обрабатывает все кодировки, а также не делает такой код простым и правильным. Даже такие основные вещи, как размер персонажа, который вы должны читать (не говоря уже о части кодирования), сложны, так как wchar_t может быть слишком маленьким (искажать ваши данные) или слишком большим (тратить пространство), а наиболее распространенным компиляторы (например, Visual С++ и Gnu С++) различаются по степени их реализации. Поэтому вам обычно нужно найти внешние библиотеки для фактической кодировки.

  • iconv, как правило, подтверждают правильность, но примеры того, как связать его с механизмом С++, трудно найти.
  • jla3ep упоминает libICU, который является очень тщательным, но API С++ не пытается хорошо играть со стандартом (насколько я могу судить: вы можете сканировать примеры, чтобы узнать, можете ли вы сделать лучше.)

Самый простой пример, который я могу найти, который охватывает все базы, - от Boost UTF-8 codecvt facet, с примером, который специально пытается кодировать UTF-8 (UCS4) для использования потоками ввода-вывода. Это похоже на это, хотя я не предлагаю просто копировать его дословно. Чтобы понять это (и я не претендую на это), источник требует больше:

typedef wchar_t ucs4_t;

std::locale old_locale;
std::locale utf8_locale(old_locale,new utf8_codecvt_facet<ucs4_t>);

...

std::wifstream input_file("data.utf8");
input_file.imbue(utf8_locale);
ucs4_t item = 0;
while (ifs >> item) { ... }

Чтобы узнать больше о локалях и как они используют грани (в том числе codecvt), взгляните на следующее:

Ответ 2

ifstream не заботится о кодировании файла. Он просто считывает символы (байты) из файла. wifstream читает широкие байты (wchar_t), но он все еще ничего не знает о кодировке файлов. wifstream достаточно хорош для UCS-2 - кодировка с фиксированной длиной символов для Unicode (каждый символ представлен двумя байтами).

Вы можете использовать библиотеку IBM ICU для работы с файлами Unicode.

Международный компонент для Unicode (ICU) - это зрелый переносимый набор библиотек C/С++ и Java для поддержки Unicode, интернационализации программного обеспечения (I18N) и глобализации (G11N), предоставляя приложениям одинаковые результаты на всех платформах.

ICU выпускается под неограниченной лицензией с открытым исходным кодом, которая подходит для использования как с коммерческим программным обеспечением, так и с другим открытым исходным кодом или свободным программным обеспечением.

Ответ 3

Конструкция широкоформатной строки и широкоформатных префиксов потока UTF-8, UTF-16 и Unicode. Если вы хотите получить техническую информацию, стандартная строка и стандартный поток не обязательно работают на ASCII (это просто то, что в основном все компьютеры там используют ASCII, у вас может быть машина EBCDIC).

Раймонд Чен однажды написал серию, иллюстрирующую, как работать с разными типами потока/строкой широкого символа.