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

Reply via email to