2010-04-13 4 views
8

¿Se puede usar una cadena UTF-8 como los argumentos para una información de inicio?¿Process.StartInfo.Arguments admite una cadena UTF-8?

Estoy tratando de pasar un UTF-8 (en este caso una cadena japonesa) a una aplicación como un argumento de consola.

Algo como esto (esto es sólo un ejemplo! (Cmd.exe habría una aplicación personalizada))

var process = new System.Diagnostics.Process(); 
process.StartInfo.Arguments = "/K \"echo これはテストです\""; 
process.StartInfo.FileName = "cmd.exe"; 
process.StartInfo.UseShellExecute = true; 

process.Start(); 
process.WaitForExit(); 

La ejecución de este parece perder la cadena UTF-8 y toda la aplicación de destino que ve es " eco ?????????"

Al ejecutar este comando directamente en la línea de comando (pegando los argumentos), la aplicación de destino recibe la cadena correctamente aunque la línea de comando no parezca mostrarla correctamente.

¿Debo hacer algo especial para habilitar la compatibilidad con UTF-8 en los argumentos o simplemente no es compatible?

Respuesta

1

Depende completamente del programa que está intentando iniciar. La clase Process es totalmente compatible con Unicode, al igual que el sistema operativo. Pero el programa puede ser viejo y usar caracteres de 8 bits. Utilizará GetCommandLineA() para recuperar los argumentos de la línea de comandos, la versión ANSI de la función de API Unicode GetCommandLineW() nativa. Y eso traduce la cadena Unicode a caracteres de 8 bits utilizando la página de códigos predeterminada del sistema configurada en el Panel de control + Opciones regionales y de idioma, Idioma para programas no Unicode. WideCharToMultiByte() usando CP_ACP.

Si esa no es la página de códigos japonesa, esa traducción produce signos de interrogación ya que los glifos japoneses solo tienen un código en la página de códigos japonesa. Cambiar la página de códigos del sistema no suele ser muy deseable para hablantes no japoneses. Utf8 ciertamente no funcionará, el programa no los va a esperar. Considere ejecutar este programa en una máquina virtual.

1

Acabo de crear una aplicación de Windows Forms que muestra Environment.CommandLine en un RichTextBox, y la cadena se mostró correctamente, por lo que es posible pasar una cadena Unicode de esta manera.

Creo que mi sistema operativo utiliza la página de códigos 1252 de forma predeterminada, por lo que no puedo mostrar estos caracteres en el símbolo del sistema, incluso cuando pegue los argumentos como lo hizo.

+0

¿Pasó los argumentos a su aplicación iniciando la aplicación usando Process y ProcessStartInfo o directamente desde la línea de comandos? –

+0

Utilicé Process/ProcessStartInfo: solo cambié "cmd.exe" a "test.exe", que era mi aplicación WinForms. –

0

Las cadenas utilizadas [System.String o simple string] están basadas en Unicode. Entonces, sí, pueden mantener la codificación mencionada anteriormente.

Tener una mirada here

Es necesario comprobar los ajustes relacionados con el sistema operativo (páginas de códigos, idiomas, etc.)

+0

Sé que las cadenas admiten Unicode: no estoy seguro de si la propiedad Arguments en ProcessStartInfo propaga correctamente esto a la aplicación en ejecución. Parece que no. –

4

programas reciben sus líneas de comando en UTF-16, la misma codificación que las cadenas de .NET:

Arguments = "/U /K \"echo これはテストです> output.txt\""; 

Es la ventana de la consola que no puede mostrar caracteres fuera de su página de códigos/fuente seleccionada. Sin embargo, asumo que no desea llamar a eco, por lo que esto depende completamente de cómo se escribe el programa que está llamando.

Algunos información de fondo: C o C++ programas que utilizan los (página del sistema de código) puntos de entrada 'estrechas', por ejemplo main(int argc, char** argv), en lugar de los puntos de entrada 'amplia' (UTF-16), wmain(int argc, wchar_t** argv), son llamados por un talón eso convierte la línea de comando a la página de códigos del sistema, que no puede ser UTF-8.

De lejos, la mejor opción es cambiar el programa para usar un punto de entrada amplio, y simplemente obtener el mismo UTF-16 que tenía en su cadena .NET. Si eso no es posible, entonces un truco que podría intentar es hacer pasar una línea de comandos UTF-16 que cuando se convierte a la página de códigos del sistema es UTF-8 para los caracteres que desea que utilice:

Arguments = Encoding.Default.GetString(Encoding.UTF8.GetBytes(args)); 

Advertencia Coder : No se sorprenda si esto va horriblemente mal en su máquina o la de otra persona, depende de que cada byte posible sea válido en la página de códigos del sistema actual, la página de códigos del sistema no es diferente de cuando se inició su programa, el programa que está ejecutando no usar los datos para ninguna función de Windows dependiente de la codificación (aquellos con versiones con sufijo A, W), y así sucesivamente.

+0

Sí Puedo ver que los programas reciben sus líneas de comandos en Unicode pero lo que no sé es si StartInfo.Arguments de la clase Process puede propagar el valor a la aplicación en Unicode. En mi prueba, no parece. –

+0

@Patrick: para ser completamente preciso, cuando se ha iniciado un programa, el valor bruto que recibe de Windows siempre está en Unicode. Dependiendo de cómo esté escrito, puede que se haya convertido a la página de códigos del sistema antes de que lo vea. –

+0

Si usa 'main' para el punto de entrada, aún puede obtener los argumentos UTF-16 usando GetCommandLine (http://msdn.microsoft.com/en-us/library/ms683156(VS.85).aspx). Así es como funciona QCoreApplication de Qt en Windows. – Patrick

Cuestiones relacionadas