Change command line processing API to use wchar_t.
Fixes #2128.
diff --git a/Python/frozenmain.c b/Python/frozenmain.c
index 397f046..88c3465 100644
--- a/Python/frozenmain.c
+++ b/Python/frozenmain.c
@@ -2,6 +2,7 @@
 /* Python interpreter main program for frozen scripts */
 
 #include "Python.h"
+#include <locale.h>
 
 #ifdef MS_WINDOWS
 extern void PyWinFreeze_ExeInit(void);
@@ -15,9 +16,13 @@
 Py_FrozenMain(int argc, char **argv)
 {
 	char *p;
-	int n, sts;
+	int i, n, sts;
 	int inspect = 0;
 	int unbuffered = 0;
+	char *oldloc;
+	wchar_t **argv_copy = PyMem_Malloc(sizeof(wchar_t*)*argc);
+	/* We need a second copies, as Python might modify the first one. */
+	wchar_t **argv_copy2 = PyMem_Malloc(sizeof(wchar_t*)*argc);
 
 	Py_FrozenFlag = 1; /* Suppress errors from getpath.c */
 
@@ -32,10 +37,33 @@
 		setbuf(stderr, (char *)NULL);
 	}
 
+	if (!argv_copy) {
+		fprintf(stderr, "out of memory");
+		return 1;
+	}
+
+	oldloc = setlocale(LC_ALL, NULL);
+	setlocale(LC_ALL, "");
+	for (i = 0; i < argc; i++) {
+		size_t argsize = mbstowcs(NULL, argv[i], 0);
+		if (argsize == (size_t)-1) {
+			fprintf(stderr, "Could not convert argument %d to string", i);
+			return 1;
+		}
+		argv_copy[i] = PyMem_Malloc((argsize+1)*sizeof(wchar_t));
+		argv_copy2[i] = argv_copy[i];
+		if (!argv_copy[i]) {
+			fprintf(stderr, "out of memory");
+			return 1;
+		}
+		mbstowcs(argv_copy[i], argv[i], argsize+1);
+	}
+	setlocale(LC_ALL, oldloc);
+
 #ifdef MS_WINDOWS
 	PyInitFrozenExtensions();
 #endif /* MS_WINDOWS */
-	Py_SetProgramName(argv[0]);
+	Py_SetProgramName(argv_copy[0]);
 	Py_Initialize();
 #ifdef MS_WINDOWS
 	PyWinFreeze_ExeInit();
@@ -45,7 +73,7 @@
 		fprintf(stderr, "Python %s\n%s\n",
 			Py_GetVersion(), Py_GetCopyright());
 
-	PySys_SetArgv(argc, argv);
+	PySys_SetArgv(argc, argv_copy);
 
 	n = PyImport_ImportFrozenModule("__main__");
 	if (n == 0)
@@ -64,5 +92,10 @@
 	PyWinFreeze_ExeTerm();
 #endif
 	Py_Finalize();
+	for (i = 0; i < argc; i++) {
+		PyMem_Free(argv_copy2[i]);
+	}
+	PyMem_Free(argv_copy);
+	PyMem_Free(argv_copy2);
 	return sts;
 }