Я использую fgetws, чтобы получить строку за строкой из ФАЙЛА. Файл, который у меня есть, от команды popen. Вот фрагмент кода:
FILE* pInstalledApps = popen( command.c_str(), "r" );
if( NULL != pInstalledApps )
{
wchar_t currentAppPath [kMaximumAppPathLength];
// Reading app paths one line at a time.
while ( ! feof (pInstalledApps) )
{
if ( fgetws ( currentAppPath, kMaximumAppPathLength, pInstalledApps) == NULL )
{
break;
}
wchar_t *pCharPos = NULL;
if ( ( pCharPos = wcschr( currentAppPath, L'\n' ) ) != NULL )
{
*pCharPos = L'\0';
}
std::wstring appPath( currentAppPath );
//Do something with the wstring
}
pclose( pInstalledApps );
}
Когда строка currentAppPath, которую я получаю, имеет широкие строки символов, appPath, который я получаю, не имеет ожидаемой строки. Например, если строка, которую я получаю из ФАЙЛА, 10teciêênks
моя переменная appPath будет иметь 10tecieÌeÌnks
,
Это похоже на проблему кодирования (или, точнее, декодирования). Функции API широких символов не будут автоматически определять кодировку символов данных. Вам необходимо установить это в приложении, например:
#include <locale.h>
setlocale(LC_ALL, "en.UTF-8");
Справочная страница для fgetws
состояния:
The behavior of fgetws() depends on the LC_CTYPE category of the current locale.
так что с помощью:
setlocale(LC_CTYPE, "en.UTF-8");
также должен работать.
ПРИМЕЧАНИЕ. Приведенное выше предполагает, что данные имеют кодировку UTF-8.
ОБНОВЛЕНИЕ: можно сохранить текущую локаль, выполнив что-то вроде:
char *prev_locale = strdup(setlocale(LC_CTYPE, NULL));
setlocale(LC_CTYPE, "en.UTF-8");
// ...
setlocale(LC_CTYPE, prev_locale);
free(prev_locale);