¿Por qué falla csc.exe la última vez que dejé la codificación de salida como UTF8?
Estoy teniendo estoy teniendo o me he encontrado con algo muy extraño.
Me pregunto si otros lo han hecho y por qué está sucediendo.
Habiendo ejecutado un programa de una línea con esta líneaSystem.Console.WriteLine(System.Console.OutputEncoding.EncodingName);
Veo que la codificación esWestern European (DOS)
Multa
Aquí hay una lista de algunas páginas de códigos1200 Unicode
y65001 utf-8
yWindows-1252 Western European (Windows)
y850 Western European DOS
dehttps://msdn.microsoft.com/en-us/library/system.text.encoding(v=vs.110).aspx
Digamos que escribo un programa C sharp para cambiar la codificación a utf-8
class sdf
{
static void Main(string[] args)
{
System.Console.WriteLine(System.Console.OutputEncoding.EncodingName);
System.Console.OutputEncoding=System.Text.Encoding.GetEncoding(65001);
System.Console.WriteLine(System.Console.OutputEncoding.EncodingName);
}
}
Funciona, imprime
Western European (DOS)
Unicode (UTF-8)
Ahora, cuando ejecuto csc nuevamente, csc falla.
Revisé mi RAM durante 14 horas, 8 pases, con memtest. Corrí chkdsk mi disco duro, todo bien. Y esto definitivamente no es eso, este es un problema de codificación. Lo sé porque si abro un nuevo indicador de cmd, luego ejecuto csc, no se bloquea.
Entonces, al ejecutar ese programa c sharp, cambia el shell de tal manera que la próxima vez que solo ejecute csc se bloquee csc en sí mismo, de esa gran manera.
Si compilo el código a continuación, luego lo ejecuto, luego ejecuto csc, luego ejecuto csc o csc whatever.cs, obtengo csc fallando.
Así que cierre el indicador de cmd, abra uno nuevo.
Esta vez, experimenta con comentarios y descomenta la segunda línea del programa.
Me parece que si la segunda línea (la línea que cambia la página de códigos a 850 (DOS Europa Occidental), está allí, entonces no se bloqueará la próxima vez que ejecute csc.
Mientras que si comento esa segunda línea, el programa sale con la página de códigos / codificación cambiada a UTF-8, entonces la próxima vez que csc se ejecute, csc se bloquea.
// descomenta la última línea y luego // esto se ejecuta pero hace que csc se bloquee la próxima vez.
class asdf
{
static void Main()
{
System.Console.OutputEncoding = System.Text.Encoding.UTF8; //output and to utf8
System.Console.OutputEncoding=System.Text.Encoding.GetEncoding(850);
}
}
No soy la única persona que se ha encontrado con algo como esto
aunque no se encontró ninguna explicación allíhttps://social.msdn.microsoft.com/Forums/vstudio/en-US/0e5f477e-0c32-4e88-acf7-d53d43d5b566/c-command-line-compiler-cscexe-immediately-crashes-when-run-in- code-page-65001-utf8? forum = csharpgeneral
Puedo lidiar con eso asegurándome de que la última línea establece la página de códigos en 850. Aunque, como explicaré, esa es una solución inadecuada ...
También me gustaría saber si este es un problema con CSC que otros también tienen. O cualquier otra solución.
adicional
uuu1.cs
// uuu1.cs
class asdf
{
static void Main()
{
System.Console.InputEncoding = System.Text.Encoding.UTF8;
System.Console.OutputEncoding = System.Text.Encoding.UTF8;
// not unicode. UTF8 means redirection will then work
System.Console.WriteLine("ჵ");
// try redirecting too..
// and try checking for csc crash or not
//System.Console.OutputEncoding=System.Text.Encoding.GetEncoding(850);
//System.Console.InputEncoding =System.Text.Encoding.GetEncoding(850);
//problem is that when that is commented, it breaks the redirection
}
}
Agregar la línea / descomentar las últimas líneas, así que tengo
System.Console.OutputEncoding = System.Text.Encoding.GetEncoding (850);
detendría el bloqueo, pero es una solución inadecuada, porque, por ejemplo, si quiero redirigir la salida de un programa a un archivo, entonces necesito UTF8 desde el principio hasta el final, de lo contrario no funciona
esto funciona con la línea de la página de códigos 850 sin comentarios
c:\blah>uuu1>r.r<ENTER>
c:\blah>type r.r <ENTER>
c:\blah>ჵ
Si descomento las últimas líneas, cambiando así la página de códigos a 850, entonces asegúrese de que csc no se bloqueará en la próxima ejecución, pero la redirección no funciona y r.r no contiene ese carácter.
Agregado 2
La respuesta de Han me hace notar otra forma de activar este error.
C:\Users\harvey\somecs3>csc<ENTER>
Microsoft (R) Visual C# Compiler version 4.0.30319.18408
for Microsoft (R) .NET Framework 4.5
Copyright (C) Microsoft Corporation. All rights reserved.
warning CS2008: No source files specified
error CS1562: Outputs without source must have the /out option specified
C:\Users\harvey\somecs3>chcp 65001<ENTER>
Active code page: 65001
C:\Users\harvey\somecs3>csc<ENTER> <-- CRASH
C:\Users\harvey\somecs3>