如何在PowerShell中读取UTF-16编码的StdIn

时间:2018-02-06 18:40:05

标签: powershell winapi encoding

我试图将(大量[1])字符串从本机Windows主机应用程序(C ++ / WinApi)传递到PowerShell脚本,主机应用程序使用CreateProcess启动它。

我在STARTUPINFO::hStdInput中使用匿名管道作为IPC机制。写入管道的数据由UTF-16LE字符串[2]组成。由朴素的PowerShell脚本打印的内容

foreach ($line in $input) {
    write-host  $line
}

但是,看起来StdIn中的数据正在ANSI代码页中解释(输入中的每个UTF 16代码单元在输出中显示为一对字母)。

如何让PowerShell将StdIn中的数据识别为UTF-16?

我已经尝试

  • 在管道上的其余数据之前添加UTF-16 BOM
  • 使用PowerShell $InputEncoding$OutputEncoding和.Net' s [Console]::InputEncoding

无济于事。是的,我可以先写一个大的文本文件,然后在PowerShell中读取它,但我宁愿不这样做。

[1]这就是我想使用管道并利用PowerShell的流处理功能的原因 [2]不能将数据转换为非Unicode代码页。

1 个答案:

答案 0 :(得分:0)

最后终于解决了这个老问题:正确设置.Net控制台输入编码(这是Powershell构建的基础)是一个非常重要的问题。我终于解决了这个问题,因为我不想让Powershell-script开发人员负担输入编码设置。所以我结束了

  • 将数据编码为CLIXML中的Common Language Infrastructure对象
  • 使用"#< CLIXML\r\n"标记对流进行前缀以将格式声明为Powershell
  • 最后(* cringe)将xml文档中的每个字符转义为ASCII范围之外,以完全避免任何输入编码歧义

最后一点很必要,因为clixml的处理仅在文本经过脆弱的控制台输入解码过程之后才能实现。