fgetws не может получить точную широкую строку символов из FILE *

Я использую 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,

0

Решение

Это похоже на проблему кодирования (или, точнее, декодирования). Функции 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);
1

Другие решения


По вопросам рекламы [email protected]