进程输出丢失unicode字符

时间:2018-02-15 16:22:54

标签: c# .net unicode 7zip

我有一个以下的精简版片段:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;

namespace ConsoleApp2
{
    public class Echo
    {
        public List<string> Run(string arg)
        {
            var output = new List<string>();

            var bytes = Encoding.UTF8.GetBytes($"/C echo {arg}");

            var x = new UnicodeEncoding(false, true, true);

            var p = new Process
            {
                StartInfo = new ProcessStartInfo("cmd.exe")
                {
                    Arguments = x.GetString(Encoding.Convert(Encoding.UTF8, x, bytes)),
                    RedirectStandardOutput = true,
                    UseShellExecute = false,
                    CreateNoWindow = true,
                    StandardOutputEncoding = Encoding.UTF8
                }
            };

            p.OutputDataReceived += (sender, a) =>
            {
                if (a.Data != null) output.Add(a.Data);
            };

            p.Start();
            p.BeginOutputReadLine();
            p.WaitForExit();
            p.Close();

            return output;
        }
    }
}

当我运行此命令时,如果输入了unicode字符,则该字符将丢失:

var dot = "•";
var echo = new Echo();

var result = echo.Run(dot)?.FirstOrDefault();

Console.WriteLine($"[{dot}] [{result}] {dot == result}");

关于如何保存&#39;的任何想法这些?

1 个答案:

答案 0 :(得分:0)

这里的问题是echo使用的编码与提供的参数的编码不兼容。

通常,process.Start()调用的应用程序需要能够使用所需的编码输出数据。

就我而言,它是7zip文件列表。使用l -slt ...时,路径中的Unicode字符“丢失”。使用l -slt ... -scsUTF-8 -sccUTF-8解决了案例。