Winapi 捕获程序时需要哪种文本编码';s输出到标准输出?

Winapi 捕获程序时需要哪种文本编码';s输出到标准输出?,winapi,Winapi,我正在捕获一个外部程序的输出,如上所述。现在,我想知道当使用ReadFile()将管道数据读入内存缓冲区时,预期的文本编码是什么 外部程序可以以各种方式写入标准输出,例如: 使用printf() 使用wprintf() 使用writeconolea() 使用WriteConsoleW() 因此,如果程序使用wprintf()或WriteConsoleW()写入stdout,我将获得UTF-16文本,如果程序使用printf()或WriteConsoleA(),我将获得8位文本(取决于默认的

我正在捕获一个外部程序的输出,如上所述。现在,我想知道当使用
ReadFile()
将管道数据读入内存缓冲区时,预期的文本编码是什么

外部程序可以以各种方式写入标准输出,例如:

  • 使用
    printf()
  • 使用
    wprintf()
  • 使用
    writeconolea()
  • 使用
    WriteConsoleW()

因此,如果程序使用
wprintf()
WriteConsoleW()
写入
stdout
,我将获得UTF-16文本,如果程序使用
printf()
WriteConsoleA()
,我将获得8位文本(取决于默认的控制台编码)?或者从外部程序捕获的文本将采用什么编码?

TD;医生:这取决于课程

WriteConsoleA/W
无法写入管道,只能写入控制台,因此它们不是这里的一个因素

直接使用
WriteFile
的程序将以给定给函数的任何格式写入数据。最有可能是活动的ANSI代码页、OEM代码页或UTF16-LE

使用wchar\u t打印功能和Microsoft C运行时的程序可以通过调用或
\u wsopen
来选择输出格式(
\u O\u WTEXT
(带BOM的UTF-16)、
\u U8TEXT
\u O\u U16TEXT

大多数程序不会输出UTF16-LE,除非您给它们一个开关以启用此功能(
cmd.exe/U
等)。如果您对程序一无所知,但更喜欢Unicode,那么最好的方法是查找BOM,如果BOM不存在,则尝试将其解析为UTF-8,如果失败,则返回ANSI或OEM代码页。如果您有相当数量的缓冲,您也可以尝试使用
istextanicode
检测没有BOM的UTF-16

如果您连接到一个控制台,您可以通过调用
SetConsoleOutputCP
尝试影响其他进程,但我怀疑是否有人会听

另见: