C#问题中的另一个编码/解码

本文关键字:编码 解码 另一个 问题 | 更新日期: 2023-09-27 18:03:03

我一直在为CLI开发GUI。我不是把所有内容都写到一个文本文件中,而是重定向标准输出,然后用我可以在GUI代码中使用/重用的输出创建一个卑鄙的输出。我已经尝试了我遇到的所有可能的解决方案,但我还没有完全解决这个问题。这几乎就像返回中的每一行都是用两种不同的方式编码的。以下是我的命令行界面:

class CmdToolInteraction
{
    private static string returnString = null;
    public string runcommandline(string argumentString)
    {
        UnicodeEncoding uni = new UnicodeEncoding();
        Process proc;
        proc = new Process();
        proc.StartInfo.FileName = "cmd.exe";
        proc.StartInfo.Arguments = argumentString;
        proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
        proc.StartInfo.UseShellExecute = false;
        proc.StartInfo.RedirectStandardOutput = true;
        proc.StartInfo.RedirectStandardInput = true;
        proc.Start();
        StreamWriter cmdStreamWriter = proc.StandardInput;
        cmdStreamWriter.Write(argumentString);
        cmdStreamWriter.Close();
       returnString = uni.GetString(proc.StandardOutput.CurrentEncoding.GetBytes(proc.StandardOutput.ReadToEndAsync().Result));
        proc.WaitForExit();
        Console.Write(returnString);
        return returnString;
    }
}

我遇到的问题显然是输出。其中一些是可读的英文白色,其余是jibberish/中文,即

"someone@somewhere.net਍  䰀愀渀最甀愀最攀㨀 攀渀ഀ'n Success਍ഀ"

在某些情况下,当我知道应该使用英语字母数字时,整行或回车看起来像上面的后半部分。

哈尔普!

编辑:

我更新了上面的代码,添加了proc.Startinfo.StandardOutputEncoding = Encuding.Unicode

我还记得这根绳子"someone@somewhere.net਍  䰀愀渀最甀愀最攀㨀 攀渀ഀ'n Success਍ഀ",但我现在知道为什么了。本例中的第二部分是BigEndian unicode,而其余部分是LittleEndian。现在我正试图弄清楚如何清理未解释的部分。

编辑#2在roelands的建议下,我接受了unicode输出,并试图将其转换为ascii。类似的问题,但我觉得我离"someone@somewhere.net਍  䰀愀渀最甀愀最攀㨀 攀渀ഀ'n Success਍ഀ"越来越近了,现在读作"someone@somewhere.net???????????????'n Success??"

我的解码设置为:

byte[] bytes = Encoding.ASCII.GetBytes(proc.StandardOutput.ReadToEnd());
returnString = Encoding.ASCII.GetString(bytes);

C#问题中的另一个编码/解码

我认为这确实是一个编码问题。这是一个字节列表(字符串的一部分(,假设该字符串是UTF-16little-endian。仔细观察换行符周围的字节:

119 'w'
  0
104 'h'
  0
101 'e'
  0
114 'r'
  0
101 'e'
  0
 46 '.'
  0
110 'n'
  0
101 'e'
  0
116 't'
  0
 13 CR
 10 LF
  0
 32 ' '
  0
 32 ' '
  0
 76 'L'
  0
 97 'a'
  0
110 'n'
  0
103 'g'
  0
117 'u'
  0

在某个时刻,UTF-16字节流被解释为ANSI文本,换行符("'n"(被扩展为CR-LF对,从而损坏UTF-16字符串。

解决方案取决于程序的工作方式。您需要通过CMD命令处理器运行程序吗?如果是,您是否使用/U选项?否则,您可以以二进制模式打开I/O流吗?

您似乎混淆了对字符串和编码的理解。线路:

returnString = uni.GetString(proc.StandardOutput.CurrentEncoding.GetBytes(proc.StandardOutput.ReadToEndAsync().Result));

毫无意义。proc.StandardOutput.ReadToEndAsync().Result(^(已返回一个字符串。这意味着控制台输出中的字节流已经被编码为字符串。.Net中字符串的内部表示恰好是UTF-16,但您不应该关心它是什么。string对象是字符串的不透明表示。一旦你有了一个字符串,你就不应该在意它是如何在内部存储的。当您将它转换回字节时,您只需要关心这一点。然后,您需要选择该字符串的表示方式(即使用什么编码(。

为了从cmd进程中获得输出,您只需调用:

returnString = proc.StandardOutput.ReadToEnd();
p.WaitForExit();

如果你仍然胡言乱语,那么你可以看看在命令控制台内运行的应用程序。我敢打赌,如果你在外部命令控制台中运行参数,你会得到同样的结果。

(^(为什么使用ReadToEndAsync().Result而不是仅使用ReadToEnd