gpt4 book ai didi

c++ - 将生成的进程标准输出捕获为 unicode

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:07:56 25 4
gpt4 key购买 nike

在我的 C++/WinAPI 代码中,我想运行一些命令并捕获它们的输出。为了测试非 ASCII 输出,我将我的网络连接重命名为 Ethérnét אבג БбИгДд 并运行 ipconfig。在命令提示符下运行时,输出正确(使用 Courier New 等支持字体时可见):

C:\>ipconfig
Windows IP Configuration

Ethernet adapter Ethérnét אבג БбГгДд:
(...)

我尝试将输出重定向到管道,跟随 the example in this answer .但是从 ReadFile() 返回的字节数组不是 unicode - 它是在 CP_OEMCP(在我的例子中是 CP437)中编码的,所以希伯来语和俄语字符以“?”的形式出现。由于字符已经丢失,没有进一步的处理可以恢复它们。

显然这是可能的,因为控制台窗口中的 cmd 可以做到这一点。我该怎么做?

最佳答案

ipconfig 似乎在检测到输出设备是控制台时生成 Unicode 输出,否则生成 ANSI 输出。这可能是一种向后兼容措施。

出于同样的原因,大多数其他内置命令行工具可能要么是纯 ANSI 的,要么以与 ipconfig 相同的方式运行。在 Windows 中,命令行工具意味着在命令行上使用。不鼓励程序员向他们支付费用并解析输出。相反,您应该使用相应的 API。

如果您知道您希望使用哪种语言,您或许可以选择一个代码页来保留内容。

由@Jonathan 添加:未记录: 结果证明您可以使用环境变量OutputEncoding 控制内置命令的编码。我使用 ipconfig 进行了测试,但大概它也适用于其他内置工具:

> for %e in ("" Unicode Ansi UTF8) do (set OutputEncoding=%~e& ipconfig >ipconfig-%~e.txt)
> (set OutputEncoding= & ipconfig 1>ipconfig-.txt )
> (set OutputEncoding=Unicode & ipconfig 1>ipconfig-Unicode.txt )
> (set OutputEncoding=Ansi & ipconfig 1>ipconfig-Ansi.txt )
> (set OutputEncoding=UTF8 & ipconfig 1>ipconfig-UTF8.txt )

事实上,ipconfig-*.txt 是按预期进行的!请注意,这没有记录,但它对我有用。

附录: 从 Windows 10 v1809 开始,另一种选择是创建一个 pseudoconsole.

关于c++ - 将生成的进程标准输出捕获为 unicode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41440159/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com