У меня есть или я столкнулся с очень странной вещью.
Интересно, есть ли у других и почему это происходит.
Запустив однострочную программу с этой строкой System.Console.WriteLine(System.Console.OutputEncoding.EncodingName);
, я вижу, что кодировка Western European (DOS)
Отлично
Вот список некоторых кодовых страниц 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 падает.
Проверил оперативку 14 часов, 8 проходов, мемтестом. Я запустил chkdsk на своем жестком диске, все в порядке. И это точно не те, это вопрос кодировки. Я знаю это, потому что если я открою новую командную строку, а затем запущу csc, она не сработает.
Таким образом, запуск этой программы c Sharp изменяет оболочку таким образом, что в следующий раз, когда просто запускается csc, происходит сбой самой csc, в такой большой степени.
Если я скомпилирую приведенный ниже код, а затем запущу его, затем запущу csc, затем запущу csc или csc какой угодно.cs, я получу сбой csc.
Поэтому закройте командную строку, откройте новую.
На этот раз поэкспериментируйте с комментарием и раскомментированием второй строки программы.
Я обнаружил, что если есть вторая строка (строка, которая меняет кодовую страницу на 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);
}
}
Я не единственный человек, который столкнулся с чем-то подобным
хотя никаких объяснений там не было найдено -немедленно-вылетает-при-запуске-в-кодовой-странице-65001-utf8?forum=csharpgeneral" rel="nofollow noreferrer">https://social.msdn.microsoft.com/Forums/vstudio/en-US/ 0e5f477e-0c32-4e88-acf7-d53d43d5b566/c-командная-строка-компилятор-cscexe-немедленно-сбой-при-запуске-в-кодовой-странице-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>
.cs
, например.aaa1.cs
затем запуститеcsc aaa1.cs
- person barlop   schedule 20.06.2015csc
из .NET 3+ продолжал падать. Как только я увидел этот пост, я вспомнил, чтоfind
также дает сбой, когда используется кодовая страница Unicode (chcp 65001
), и действительно, изменение кодовой страницы на 437 позволяетcsc
работать без сбоев. Очень плохо, что собственные программы Microsoft не могут обрабатывать Unicode. ¬_¬ - person Synetech   schedule 20.05.2021