mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2024-11-14 21:37:52 -07:00
DolphinQt: Handle non-ASCII characters in Windows cmd arguments
CommandLineParse expects UTF-8 strings. (QApplication, on the other hand, seems to be designed so that you can pass in the char** argv untouched on Windows and get proper Unicode handling.)
This commit is contained in:
parent
39df01434c
commit
16d2ef1ea9
@ -31,6 +31,7 @@
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <Windows.h>
|
||||
#include <shellapi.h>
|
||||
constexpr u32 CODEPAGE_SHIFT_JIS = 932;
|
||||
constexpr u32 CODEPAGE_WINDOWS_1252 = 1252;
|
||||
#else
|
||||
@ -630,3 +631,22 @@ std::string PathToString(const std::filesystem::path& path)
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef _WIN32
|
||||
std::vector<std::string> CommandLineToUtf8Argv(const wchar_t* command_line)
|
||||
{
|
||||
int nargs;
|
||||
LPWSTR* tokenized = CommandLineToArgvW(command_line, &nargs);
|
||||
if (!tokenized)
|
||||
return {};
|
||||
|
||||
std::vector<std::string> argv(nargs);
|
||||
for (size_t i = 0; i < nargs; ++i)
|
||||
{
|
||||
argv[i] = WStringToUTF8(tokenized[i]);
|
||||
}
|
||||
|
||||
LocalFree(tokenized);
|
||||
return argv;
|
||||
}
|
||||
#endif
|
||||
|
@ -236,3 +236,7 @@ inline bool IsPrintableCharacter(char c)
|
||||
{
|
||||
return std::isprint(c, std::locale::classic());
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
std::vector<std::string> CommandLineToUtf8Argv(const wchar_t* command_line);
|
||||
#endif
|
||||
|
@ -3,6 +3,9 @@
|
||||
// Refer to the license.txt file included.
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include <Windows.h>
|
||||
#include <cstdio>
|
||||
#endif
|
||||
@ -101,6 +104,12 @@ static bool QtMsgAlertHandler(const char* caption, const char* text, bool yes_no
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
#ifdef _WIN32
|
||||
std::vector<std::string> utf8_args = CommandLineToUtf8Argv(GetCommandLineW());
|
||||
const int utf8_argc = static_cast<int>(utf8_args.size());
|
||||
std::vector<char*> utf8_argv(utf8_args.size());
|
||||
for (size_t i = 0; i < utf8_args.size(); ++i)
|
||||
utf8_argv[i] = utf8_args[i].data();
|
||||
|
||||
const bool console_attached = AttachConsole(ATTACH_PARENT_PROCESS) != FALSE;
|
||||
HANDLE stdout_handle = ::GetStdHandle(STD_OUTPUT_HANDLE);
|
||||
if (console_attached && stdout_handle)
|
||||
@ -123,7 +132,12 @@ int main(int argc, char* argv[])
|
||||
#endif
|
||||
|
||||
auto parser = CommandLineParse::CreateParser(CommandLineParse::ParserOptions::IncludeGUIOptions);
|
||||
const optparse::Values& options = CommandLineParse::ParseArguments(parser.get(), argc, argv);
|
||||
const optparse::Values& options =
|
||||
#ifdef _WIN32
|
||||
CommandLineParse::ParseArguments(parser.get(), utf8_argc, utf8_argv.data());
|
||||
#else
|
||||
CommandLineParse::ParseArguments(parser.get(), argc, argv);
|
||||
#endif
|
||||
const std::vector<std::string> args = parser->args();
|
||||
|
||||
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
|
||||
|
@ -16,26 +16,6 @@
|
||||
#include "UpdaterCommon/UI.h"
|
||||
#include "UpdaterCommon/UpdaterCommon.h"
|
||||
|
||||
namespace
|
||||
{
|
||||
std::vector<std::string> CommandLineToUtf8Argv(PCWSTR command_line)
|
||||
{
|
||||
int nargs;
|
||||
LPWSTR* tokenized = CommandLineToArgvW(command_line, &nargs);
|
||||
if (!tokenized)
|
||||
return {};
|
||||
|
||||
std::vector<std::string> argv(nargs);
|
||||
for (int i = 0; i < nargs; ++i)
|
||||
{
|
||||
argv[i] = WStringToUTF8(tokenized[i]);
|
||||
}
|
||||
|
||||
LocalFree(tokenized);
|
||||
return argv;
|
||||
}
|
||||
}; // namespace
|
||||
|
||||
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow)
|
||||
{
|
||||
if (lstrlenW(pCmdLine) == 0)
|
||||
|
Loading…
Reference in New Issue
Block a user