调用外部ScanState.exe时输出显示为空的问题排查
解决ScanState.exe输出含空字符的问题
问题根源
ScanState.exe的输出采用**UTF-16 LE(宽字符)**编码,而默认情况下StandardOutput使用系统默认编码(通常为ANSI)读取,导致每个有效字符后被插入空字节(\0),最终呈现为空白内容。
修复方案
1. 直接指定进程输出编码
在启动进程前,将输出和错误流的编码设置为Encoding.Unicode(对应UTF-16 LE),从根源避免空字符生成:
private void button1_Click(object sender, EventArgs e) { System.Diagnostics.Process process = new System.Diagnostics.Process(); process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; process.StartInfo.FileName = @"amd64\scanstate.exe"; process.StartInfo.Arguments = ""; process.StartInfo.UseShellExecute = false; process.StartInfo.CreateNoWindow = true; process.StartInfo.RedirectStandardOutput = true; process.StartInfo.RedirectStandardError = true; process.StartInfo.RedirectStandardInput = true; // 关键:指定UTF-16编码读取输出流 process.StartInfo.StandardOutputEncoding = Encoding.Unicode; process.StartInfo.StandardErrorEncoding = Encoding.Unicode; process.Start(); // 先读取流再等待进程退出,避免死锁 string output = process.StandardOutput.ReadToEnd(); string error = process.StandardError.ReadToEnd(); process.WaitForExit(); MessageBox.Show(output); MessageBox.Show(error); }
2. 修复已读取的含空字符字符串
如果已经获取了带\0的字符串,可通过以下两种方式清理:
// 方式1:直接移除所有空字符 string cleanedText = q.Replace("\0", ""); // 方式2:将字节数组按UTF-16重新解码 byte[] rawBytes = Encoding.Default.GetBytes(q); string cleanedText = Encoding.Unicode.GetString(rawBytes);
额外提示
- 不要在
while (!process.HasExited)循环中反复调用ReadToEnd(),该方法会阻塞到流结束,容易引发死锁,直接读取后等待进程退出更安全。 - 从错误内容看,当前运行权限不足,需右键程序选择「以管理员身份运行」,或在项目属性中配置UAC权限要求。
内容的提问来源于stack exchange,提问作者Matthew Malone
相关产品推荐
相关产品推荐

