Can you use a UTF-8 string as the Arguments for a StartInfo?
I am trying to pass a UTF-8 (in this case a Japanese string) to an application as a console argument.
Something like this (this is just an example! (cmd.exe would be a custom app))
var process = new System.Diagnostics.Process();
process.StartInfo.Arguments = "/K \"echo これはテストです\"";
process.StartInfo.FileName = "cmd.exe";
process.StartInfo.UseShellExecute = true;
process.Start();
process.WaitForExit();
Executing this seems to loose the UTF-8 string and all the target application sees is “echo ?????????”
When executing this command directly on the command line (by pasting the arguments) the target application receives the string correctly even though the command line itself doesn’t seem to display it correctly.
Do I need to do anything special to enable UTF-8 support in the arguments or is this just not supported?
It completely depends on the program you are trying to start. The Process class fully supports Unicode, as does the operating system. But the program might be old and use 8-bit characters. It will use GetCommandLineA() to retrieve the command line arguments, the ANSI version of the native Unicode GetCommandLineW() API function. And that translates the Unicode string to 8-bit chars using the system default code page as configured in Control Panel + Regional and Language Options, Language for Non-Unicode Programs. WideCharToMultiByte() using CP_ACP.
If that is not the Japanese code page, that translation produces question marks since the Japanese glyphs only have a code in the Japanese code page. Switching the system code page isn’t usually very desirable for non-Japanese speakers. Utf8 certainly won’t work, the program isn’t going to expect them. Consider running this program in a virtual machine.