EDIT: сначала кое-что. Windows имеет понятие кодовой страницы ANSI. Это кодовая страница по умолчанию для строк, отличных от Unicode, которую предполагает Windows. Каждая программа, использующая не-Unicode версии Windows API и не указывающая кодовую страницу явно, использует кодовую страницу ANSI .
Кодовая страница ANSI определяется параметром «Система по умолчанию locale "в Панели управления. По состоянию на Windows 10 мая 2020 года он находится в разделе «Регион / Администрация / Изменить язык системы». Для изменения этого параметра требуются права администратора.
По умолчанию Windows с установленным системным языком по умолчанию на английский sh использует кодовую страницу 1252 в качестве кодовой страницы ANSI. Эта кодовая страница не содержит японских символов. Таким образом, использование японского языка в программах, не знающих Unicode, в этой ситуации сложно или невозможно.
Похоже, OP хочет или должен использовать часть третья часть кода C ++, использующего многобайтовые строки (std::string
и / или char*
). Это не обязательно означает, что он не знает Unicode, но может. То, что пытается сделать OP, полностью зависит от способа кодирования сторонней библиотеки. Это может быть вообще невозможно.
Похоже, ваша проблема в том, что какая-то часть стороннего кода ожидает имя файла в ANSI и использует функции ANSI для открытия этого файла. В системе Engli sh со значением по умолчанию для системной локали японский язык не может быть преобразован в ANSI, потому что кодовая страница ANSI (CP1252 на практике) не содержит японских символов.
What I подумайте, что вам следует сделать, вы должны получить короткое имя файла вместо GetShortPathNameW
, преобразовать этот путь к файлу в ANSI и передать эту строку. Примерно так:
std::string WstringFilenameTostring(std::wstring str)
{
wchar_t ShortPath[MAX_PATH+1];
DWORD dw = GetShortPathNameW(str.c_str(), ShortPath, _countof(ShortPath));
char AnsiPath[MAX_PATH+1];
int n = WideCharToMultiByte(CP_ACP, 0, ShortPath, -1, AnsiPath, _countof(AnsiPath), 0, 0);
return string(AnsiPath);
}
Это код только для имен файлов . Для любой другой японской строки он вернет ерунду. В моем тесте он преобразовал "日本語 .txt" во что-то нечитаемое, но буквенно-цифровое c:)