C#如何绕过命令行编码

2024-09-28 03:24:20 发布

您现在位置:Python中文网/ 问答频道 /正文

有一个小应用程序可以作为控制台使用。当向控制台发送命令时,会进行编码,因为python无法运行名称中包含西里尔字母符号的文件。发送到控制台的字符串以CP866格式编码。可以这么说,如何对这个字符串进行“预编码”,以便在编码时对其进行解码

public Process CmdProcess = new Process();

            ProcessStartInfo cmdStartInfo = new ProcessStartInfo("cmd");

            cmdStartInfo.WorkingDirectory = SelfPath;

            cmdStartInfo.UseShellExecute = false;
            cmdStartInfo.CreateNoWindow = true;
            cmdStartInfo.RedirectStandardInput = true;
            cmdStartInfo.RedirectStandardError = true;
            cmdStartInfo.RedirectStandardOutput = true;

            CmdProcess.StartInfo = cmdStartInfo;
            CmdProcess.OutputDataReceived += cmdProcess_OutputDataReceived;
            CmdProcess.ErrorDataReceived += cmdProcess_ErrorDataReceived;
            CmdProcess.Start();
            CmdProcess.BeginOutputReadLine();
            CmdProcess.BeginErrorReadLine();


        private void SendEncodedToCmd(string input)
        {
            input = Encoding.GetEncoding(1251).GetString(Encoding.GetEncoding(866).GetBytes(input));
            CmdProcess.StandardInput.WriteLine(input);
        }


        private void cmdProcess_OutputDataReceived(object sender, DataReceivedEventArgs e)
        {
            Dispatcher.Invoke(() =>
            {
                if ((Encoding.GetEncoding(866).GetString(Encoding.GetEncoding(1251).GetBytes(e.Data))).StartsWith(@"C:\"))
                    //{ ConsoleOutTextBox.Text += $"[{EntryTextBox.Text}] >>> \n"; }
                    { ConsoleOutTextBox.Text += Encoding.GetEncoding(866).GetString(Encoding.GetEncoding(1251).GetBytes(e.Data)) + "\n"; }
                else
                    { ConsoleOutTextBox.Text += Encoding.GetEncoding(866).GetString(Encoding.GetEncoding(1251).GetBytes(e.Data)) + "\n"; }
                ConsoleScrollbarDiv.ScrollToEnd();
            });
        }
        private void cmdProcess_ErrorDataReceived(object sender, DataReceivedEventArgs e)
        {
            Dispatcher.Invoke(() =>
            {
                if ((Encoding.GetEncoding(866).GetString(Encoding.GetEncoding(1251).GetBytes(e.Data))).StartsWith(@"C:\"))
                    //{ ConsoleOutTextBox.Text += $"[{EntryTextBox.Text}] >>> \n"; }
                    { ConsoleOutTextBox.Text += Encoding.GetEncoding(866).GetString(Encoding.GetEncoding(1251).GetBytes(e.Data)) + "\n"; }
                else
                    { ConsoleOutTextBox.Text += Encoding.GetEncoding(866).GetString(Encoding.GetEncoding(1251).GetBytes(e.Data)) + "\n";}
                ConsoleScrollbarDiv.ScrollToEnd();
            });
        }

发送包含西里尔文的路径时,会发生以下情况:

C:\Users\The Bruno\source\repos\CommandExecutor\CommandExecutor\bin\Debug>python "\привет"
python: can't open file '\╨┐╤А╨╕╨▓╨╡╤В': [Errno 2] No such file or directory

Tags: texttrue编码inputdataencodinggetstringgetbytes

热门问题