Hi,
Currently mono.exe uses ANSI arguments that are encoded using system default
code page (ACP). Mono however uses UTF-8 and tries to convert them using
MONO_EXTERNAL_ENCODINGS.
This patch takes the Unicode (UTF-16) command line arguments and converts
them to UTF-8. This way there is no need to modify other code to use UTF-16
and the arguments still are in Unicode.
I also made strenc.c non-Windows in this patch because
MONO_EXTERNAL_ENCODINGS should not be used on Windows at all as it uses
UTF-16 internally and if we really need UTF-8 then we should convert from
UTF-16 rather than from ACP.
I would prefer to move argument conversion using mono_utf8_from_external to
main.c as well that would make code more clean but that would require
mono_runtime_run_main being called with UTF-8 arguments. If that is
acceptable I'll include that modification in the patch as well.
Kornél
Index: mono/mono/metadata/object.c
===================================================================
--- mono/mono/metadata/object.c (revision 99452)
+++ mono/mono/metadata/object.c (working copy)
@@ -2671,6 +2671,9 @@
basename,
NULL);
+#ifdef PLATFORM_WIN32
+ utf8_fullpath = fullpath;
+#else
utf8_fullpath = mono_utf8_from_external (fullpath);
if(utf8_fullpath == NULL) {
/* Printing the arg text will cause glib to
@@ -2684,19 +2687,27 @@
}
g_free (fullpath);
+#endif
g_free (basename);
} else {
+#ifdef PLATFORM_WIN32
+ utf8_fullpath = g_strdup (argv [0]);
+#else
utf8_fullpath = mono_utf8_from_external (argv[0]);
if(utf8_fullpath == NULL) {
g_print ("\nCannot determine the text encoding for the
assembly location: %s\n", argv[0]);
g_print ("Please add the correct encoding to
MONO_EXTERNAL_ENCODINGS and try again.\n");
exit (-1);
}
+#endif
}
main_args [0] = utf8_fullpath;
for (i = 1; i < argc; ++i) {
+#ifdef PLATFORM_WIN32
+ main_args [i] = g_strdup (argv [i]);
+#else
gchar *utf8_arg;
utf8_arg=mono_utf8_from_external (argv[i]);
@@ -2708,20 +2719,27 @@
}
main_args [i] = utf8_arg;
+#endif
}
argc--;
argv++;
if (mono_method_signature (method)->param_count) {
args = (MonoArray*)mono_array_new (domain,
mono_defaults.string_class, argc);
for (i = 0; i < argc; ++i) {
+#ifdef PLATFORM_WIN32
+ gchar *str = argv [i];
+#else
/* The encodings should all work, given that
* we've checked all these args for the
* main_args array.
*/
gchar *str = mono_utf8_from_external (argv [i]);
+#endif
MonoString *arg = mono_string_new (domain, str);
mono_array_setref (args, i, arg);
+#ifndef PLATFORM_WIN32
g_free (str);
+#endif
}
} else {
args = (MonoArray*)mono_array_new (domain,
mono_defaults.string_class, 0);
Index: mono/mono/mini/main.c
===================================================================
--- mono/mono/mini/main.c (revision 99452)
+++ mono/mono/mini/main.c (working copy)
@@ -1,8 +1,30 @@
#include "mini.h"
+#ifdef PLATFORM_WIN32
+
int
+main ()
+{
+ int argc;
+ wchar_t** wargv = CommandLineToArgvW (GetCommandLine (), &argc);
+ char** argv = g_new0 (char*, argc);
+ int i;
+
+ for (i = 0; i < argc; ++i)
+ argv [i] = g_utf16_to_utf8 (wargv [i], -1, NULL, NULL, NULL);
+
+ LocalFree (wargv);
+
+ return mono_main (argc, argv);
+}
+
+#else
+
+int
main (int argc, char* argv[])
{
return mono_main (argc, argv);
}
+#endif
+
Index: mono/mono/utils/strenc.c
===================================================================
--- mono/mono/utils/strenc.c (revision 99452)
+++ mono/mono/utils/strenc.c (working copy)
@@ -7,6 +7,9 @@
* (C) 2003 Ximian, Inc.
*/
+/* These methods should not be used on Windows as it uses UTF-16 internally. */
+#ifndef PLATFORM_WIN32
+
#include <config.h>
#include <glib.h>
#include <string.h>
@@ -214,3 +217,5 @@
return(utf8);
}
+#endif
+
Index: mono/msvc/mono.def
===================================================================
--- mono/msvc/mono.def (revision 99452)
+++ mono/msvc/mono.def (working copy)
@@ -711,10 +711,7 @@
mono_type_stack_size
mono_type_to_unmanaged
mono_unhandled_exception
-mono_unicode_from_external
-mono_unicode_to_external
mono_upgrade_remote_class_wrapper
-mono_utf8_from_external
mono_valloc
mono_value_box
mono_value_copy
_______________________________________________
Mono-devel-list mailing list
Mono-devel-list@lists.ximian.com
http://lists.ximian.com/mailman/listinfo/mono-devel-list