【问题标题】:How to read UTF-16 encoded StdIn in PowerShell如何在 PowerShell 中读取 UTF-16 编码的标准输入
【发布时间】:2018-02-06 18:40:04
【问题描述】:

我正在尝试将(大量 [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 的 [Console]::InputEncoding

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

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

【问题讨论】:

标签: powershell winapi encoding


【解决方案1】:

只是为了最终清理这个老问题:正确设置 .Net 控制台输入编码(这是 Powershell 所基于的)是一个非常重要的问题。我终于解决了这个问题,因为我不想给 Powershell 脚本开发人员增加输入编码设置的负担。所以我结束了

  • 将数据编码为CLIXML 中的公共语言基础结构对象
  • 使用 "#< CLIXML\r\n" 标记为流添加前缀以向 Powershell 声明格式
  • 最后 (*cringe*) xml 转义 xml 文档中 ASCII 范围之外的每个字符,以完全避免任何输入编码歧义

最后一点是必要的,因为只有在文本经过脆弱的控制台输入解码过程之后才会处理 clixml。

【讨论】:

  • @mklement0,有没有更好的答案?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-12
  • 2018-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-18
  • 2014-06-29
相关资源
最近更新 更多