【问题标题】:process output losing unicode characters处理输出丢失 Unicode 字符
【发布时间】:2018-02-15 16:22:53
【问题描述】:

我有以下精简的 sn-p:

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

关于如何“保存”这些的任何想法?

【问题讨论】:

  • 我没有真正的答案,但如果您设置 CreateNoWindow = false,问题就会消失。 CreateNoWindow = true 似乎导致进程输出 ASCII 文本(通过从 p.StandardOutput.BaseStream 读取验证),但我不知道为什么会这样。
  • 另外,没有必要搞乱编码。 Arguments = $"/C echo {arg}" 工作得很好。
  • @glenebob 设置CreateNoWindow = false 对我没有任何影响,仍然是同样的问题(环境敏感?我使用的是 Win 10 Pro 1709)。至于编码 - 是的,这些是我试图解决问题的尝试。
  • 有趣。我也在运行 Windows 10 专业版,1709。

标签: c# .net unicode 7zip


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2018-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 2013-08-31
    • 1970-01-01
    • 2011-11-20
    相关资源
    最近更新 更多