У меня есть или я столкнулся с очень странной вещью.
Интересно, есть ли у других и почему это происходит.
Запустив однострочную программу с этой строкой System.Console.WriteLine(System.Console.OutputEncoding.EncodingName);
, я вижу, что кодировка Western European (DOS)
Fine
Вот список некоторых кодовых страниц
1200 Unicode
и 65001 utf-8
и Windows-1252 Western European (Windows)
и 850 Western European DOS
из https://msdn.microsoft.com/en-us/library/system.text.encoding(v=vs.110).aspx
Скажем, я пишу программу C sharp, чтобы изменить кодировку на 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);
}
}
Он работает, он печатает
Western European (DOS)
Unicode (UTF-8)
Теперь, когда я снова запускаю csc, csc аварийно завершает работу.
Я проверил свою RAM на 14 часов, 8 проходов, с memtest. Я бегал chkdsk на свой жесткий диск, все в порядке. И это определенно не те, это проблема кодирования. Я знаю, потому что, если я открою новую подсказку cmd, тогда запустите csc, она не сработает.
Итак, запустив эту острую программу, она меняет оболочку таким образом, что в следующий раз только что запущенная csc сама вылетает csc. Таким образом,
Если я скомпилирую код ниже, запустите его, затем запустите csc, затем запустите csc или csc what.cs, я сбой csc.
Итак, закройте приглашение cmd, откройте новый.
На этот раз экспериментируйте с комментарием и раскомментируйте вторую строку программы
Я нахожу, что если вторая строка (строка, которая меняет кодовую страницу до 850 (DOS в Западной Европе), есть, то она не будет разбиваться при следующем запуске csc.
В то время как если я прокомментирую эту вторую строку, значит, программа выходит из кодовой страницы/кодировки, измененной на UTF-8, а затем в следующий раз, когда csc запускается, csc падает.
//раскомментируем последнюю строку, а затем // это выполняется, но в следующий раз произойдет сбой csc.
class asdf
{
static void Main()
{
System.Console.OutputEncoding = System.Text.Encoding.UTF8; //output and to utf8
System.Console.OutputEncoding=System.Text.Encoding.GetEncoding(850);
}
}
Я не единственный человек, который столкнулся с чем-то вроде этого
хотя здесь не найдено никаких объяснений 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
Я могу справиться с этим, убедившись, что последняя строка устанавливает кодовую страницу на 850. Хотя, как я объясню, это неадекватное решение..
Также я хотел бы знать, если это проблема с CSC, что другие тоже. Или любые другие решения.
добавлен
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
}
}
Добавьте строку/раскомментируйте последние строки, чтобы я имел
System.Console.OutputEncoding = System.Text.Encoding.GetEncoding(850);
остановит сбой, но будет неадекватным решением, потому что, например.. Если я хочу перенаправить вывод программы в файл, мне нужен UTF8 от начала до конца, иначе это не сработает
это работает с кодовой страницей 850 без раскопок
c:\blah>uuu1>r.r<ENTER>
c:\blah>type r.r <ENTER>
c:\blah>ჵ
Если я раскомментирую последние строки, тем самым изменив кодовую страницу до 850, тогда уверен, что csc не будет сбой при следующем запуске, но перенаправление не работает, а r.r не содержит этого символа.
Добавлено 2
Ответ Хан заставляет меня заметить другой способ вызвать эту ошибку
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>