Системные локали и не-Unicode программы - PullRequest
0 голосов
/ 26 октября 2018

У меня есть файл на локальном диске 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
...