У меня есть файл на локальном диске d: d: \ système.gz (Этот файл создан в другом регионе. Обратите внимание на файл.)
Я пытаюсь открыть этот файл, используя fopen, используя неисполняемый Unicode.Следующий код работает, когда для параметра «Язык системы» для программы, не поддерживающей Юникод, установлено значение «Английский (США)».
Если я изменю этот язык на «Японский (Япония)» (в разделе «Настройки региона»), произойдет сбой fopen.
Так выглядит память для строки 'système.gz':
1: английский (США)
73 79 73 74 e8 6d 65 2e 67 7a
2: японский (Япония)
73 79 73 74 65 6d 65 2e 67 7a
Как правильно справиться с этой ситуацией?Нужно ли вызывать какой-то API для установки локали в моем коде?
std::string path = "d:";
for (auto & p : fs::directory_iterator(path))
{
std::string fName = p.path().filename().string();
std::string ext = p.path().extension().string();
if (ext == ".gz")
{
std::string drive = "d:\\" ;
std::string fullPath = drive + fName;
const char * strPath = fullPath.c_str();
FILE * fp = fopen(strPath, "rb");
if (!fp)
{
printf("\nNot found\n");
}
fclose(fp);
}
}
Если я использую:
p.path().filename().u8string()
Тогда память изменится на: (но fopen все равно не будет работать)
73 79 73 74 c3 a8 6d 65 2e 67 7a