Created
August 25, 2021 09:07
-
-
Save kafeg/92f53b44d4c8d1faefe884be6a89744e to your computer and use it in GitHub Desktop.
Qt UTF-8 arguments, Windows
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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); | |
} |
Author
kafeg
commented
Aug 25, 2021
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment