Чтение файлов UTF8 в Windows и Linux через C ++ - PullRequest
3 голосов
/ 30 марта 2012

У меня есть несколько текстовых файлов, которые кодируются с использованием UTF-8.Есть ли способ прочитать их, используя потоковые классы c ++ (например, wifstream)?

Я видел некоторые внешние ссылки, такие как boost и некоторые фрагменты кода codeproject.Но я не хочу использовать это только для этой цели.

В Linux это как-то работает, вызывая imbue (std :: locale ("en_US")), но не в Windows.Я думаю, что проблема заключается в том, что окно предполагает, что поток wifstream является кодированным потоком UTF-16.Не могу ли я как-то указать кодировку Unicode с классом wifstream, чтобы он использовал UTF-8, а не UTF-16?

Ответы [ 2 ]

2 голосов
/ 30 марта 2012

В дополнение к обычному чтению байтов из файла и обработке их как UTF-8 (например, не передавая их чему-либо, ожидающему строки с кодировкой локали, только вещам, ожидающим UTF-8), в Windows есть еще одинспособ чтения в UTF-8.

Вы можете установить режим 'UTF-8' для файловых дескрипторов, а затем использовать ввод и вывод широких символов в этом файловом дескрипторе, и среда выполнения Microsoft C будет обрабатывать преобразование широких символовв и из кодированных UTF-8 потоков байтов:

#include <fcntl.h>
#include <io.h>
#include <stdio.h>

int main(void) {
  _setmode(_fileno(stdout), _O_U8TEXT);
  wprintf(L"\x043a\x043e\x0448\x043a\x0430 \x65e5\x672c\x56fd\n");
}

Если вы запустите вышеуказанную программу с перенаправлением вывода в файл, вы получите файл в кодировке UTF-8.

Установка одного изэти режимы Unicode для файлового дескриптора имеют дополнительный эффект для консолей, что вывод широких символов будет фактически работать на консоли.Я не уверен, почему именно Microsoft выбрала «неработающий» в качестве значения по умолчанию, но, по крайней мере, есть способ включить «неработающий» режим.

0 голосов
/ 30 марта 2012

Вы можете читать файлы utf8 в Windows совершенно нормально - единственная проблема заключается в том, что вы хотите что-то с ними сделать.

Почти все вызовы Windows API используют UTF16 или MBCS, вам нужно будет конвертировать UTF8-MBCSвсякий раз, когда вы передаете его в Windows API - см. Преобразование C-строк из локальной кодировки в UTF8

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...