处理输出丢失 unicode 字符

process output losing unicode characters

我有以下精简片段:

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}");

关于如何'preserve'这些有什么想法吗?

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

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

在我的例子中,它是 7zip 文件列表。使用 l -slt ... 时,路径中的 Unicode 字符为 'lost'。当使用 l -slt ... -scsUTF-8 -sccUTF-8 解决了这个问题。