В дополнение к обычному чтению байтов из файла и обработке их как 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 выбрала «неработающий» в качестве значения по умолчанию, но, по крайней мере, есть способ включить «неработающий» режим.