Skip to content

Instantly share code, notes, and snippets.

@kafeg
Created August 25, 2021 09:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kafeg/92f53b44d4c8d1faefe884be6a89744e to your computer and use it in GitHub Desktop.
Save kafeg/92f53b44d4c8d1faefe884be6a89744e to your computer and use it in GitHub Desktop.
Qt UTF-8 arguments, Windows
#include <QCoreApplication>
#include <QDebug>
#include <windows.h>
#include <shellapi.h>
int utf8Main(int argc, char *argv[])
{
QStringList utf8Args;
for (int i = 0; i != argc; ++i)
utf8Args.append(QString::fromUtf8(argv[i]));
qDebug() << "utf8Args" << utf8Args;
QCoreApplication app(argc, argv); // do not use a.arguments(); because it contains broken unicode
return 0;
}
int argsToUtf8(std::function<int(int, char *[])> utf8main_callback)
{
auto wideToMulti = [](unsigned int codePage, const wchar_t *aw) -> char *
{
const int required = WideCharToMultiByte(codePage, 0, aw, -1, nullptr, 0, nullptr, nullptr);
char *result = new char[required];
WideCharToMultiByte(codePage, 0, aw, -1, result, required, nullptr, nullptr);
return result;
};
int argc = 0;
wchar_t **argvW = CommandLineToArgvW(GetCommandLineW(), &argc);
if (argvW == nullptr)
return -1;
char **argv = new char *[argc + 1];
for (int i = 0; i != argc; ++i)
argv[i] = wideToMulti(CP_UTF8, argvW[i]);
argv[argc] = nullptr;
LocalFree(argvW);
const int exitCode = utf8main_callback(argc, argv);
for (int i = 0; (i != argc) && (argv[i] != nullptr); ++i)
delete [] argv[i];
delete [] argv;
return exitCode;
}
int main(int argc, char *argv[])
{
Q_UNUSED(argc);
Q_UNUSED(argv);
return argsToUtf8(utf8Main);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment