Предполагаемый способ обработки кодировок - позволить системе локали сделать это.
Вы должны установить правильную локаль, прежде чем открывать свой поток.
Кстати, вы пометили свой вопрос C ++, вы написали о fgets и fgetws, но не
IOStreams; ваша проблема C ++ или C?
Для C:
#include <locale.h>
setlocale(LC_ALL, ""); /* at least LC_CTYPE */
Для C ++
#include <locale>
std::locale::global(std::locale(""));
Тогда широкий IO (wstream, fgetws) должен работать, если ваша среда работает правильно
установить для Unicode. Если нет, вам придется изменить свою среду (я не
как это работает под Windows, для Unix, установка переменной LC_ALL
Кстати, см. locale -a
для поддерживаемых значений). В качестве альтернативы, замена
пустая строка по языку также будет работать, но тогда вы жестко
локали в вашей программе, и ваши пользователи, возможно, не оценят это.
Если ваша система не поддерживает адекватную локаль, в C ++ есть
возможность написать фасет для конвертации самостоятельно. Но что снаружи
объема этого ответа.