Предполагаемый способ обработки кодировок - позволить системе локали сделать это.
Перед тем, как открыть поток, вы должны установить правильную локаль.
BTW вы помечаете свой вопрос 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++ есть возможность написать фасет для преобразования самостоятельно. Но это за пределами сферы действия этого ответа.
Возможно, вы захотите уточнить, что вы подразумеваете под «Unicode». UTF-8? UTF-16? –
Это поможет, если вы разместите соответствующий код и сообщите нам, как результаты, которые вы видели, отличаются от ваших ожиданий. –
Обратите внимание, что не может быть ASCII-представление «странных символов» в вашем файле. –