【发布时间】: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。