aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nvim/main.c')
-rw-r--r--src/nvim/main.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/src/nvim/main.c b/src/nvim/main.c
index f601fd7ea3..af614762ac 100644
--- a/src/nvim/main.c
+++ b/src/nvim/main.c
@@ -7,6 +7,11 @@
#include <string.h>
#include <stdbool.h>
+#ifdef WIN32
+# include <wchar.h>
+# include <winnls.h>
+#endif
+
#include <msgpack.h>
#include "nvim/ascii.h"
@@ -215,10 +220,28 @@ void early_init(void)
#ifdef MAKE_LIB
int nvim_main(int argc, char **argv)
+#elif defined WIN32
+// don't use codepage encoded arguments. see #7060
+int wmain(int argc, wchar_t **argv_w)
#else
int main(int argc, char **argv)
#endif
{
+#ifdef WIN32
+ char *argv[argc];
+
+ for (size_t i = 0; i < (size_t)argc; i++) {
+ // get required buffer size
+ size_t dest_size = (size_t)WideCharToMultiByte(
+ CP_UTF8, 0, argv_w[i], -1, NULL, 0, NULL, NULL);
+ char *buf = (char *)xmallocz(dest_size);
+ // convert from utf16 (widechar) utf8 (multibyte)
+ WideCharToMultiByte(CP_UTF8, 0, argv_w[i], -1, buf, (int)dest_size,
+ NULL, NULL);
+ argv[i] = buf;
+ }
+#endif
+
argv0 = argv[0];
char_u *fname = NULL; // file name from command line