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
尝试影响其他进程,但我怀疑是否有人会听
另见: