【发布时间】:2020-05-24 05:46:24
【问题描述】:
我正在尝试通过以下方式重定向 PowerShell 中的输入:
Get-Content input.txt | my-program args
问题是管道 UTF-8 文本前面带有 BOM (0xEFBBBF),我的程序无法正确处理。
一个最小的工作示例:
// File: Hex.java
import java.io.IOException;
public class Hex {
public static void main(String[] dummy) {
int ch;
try {
while ((ch = System.in.read()) != -1) {
System.out.print(String.format("%02X ", ch));
}
} catch (IOException e) {
}
}
}
然后在 PowerShell 中:
javac Hex.java
Set-Content textfile "ABC" -Encoding Ascii
# Now the content of textfile is 0x41 42 43 0D 0A
Get-Content textfile | java Hex
或者干脆
javac Hex.java
Write-Output "ABC" | java Hex
无论哪种情况,输出都是EF BB BF 41 42 43 0D 0A。
如何在没有 0xEFBBBF 的情况下将文本通过管道传输到程序中?
【问题讨论】:
-
如果将其显式转换为字符串会发生什么?
[string](Get-Content input.txt) | my-program args -
@GuentherSchmitz BOM 仍然在这里,但是除了最后一个换行符之外的所有换行符都转换为空格。顺便说一句,虽然我的 input.txt 使用了 LF,但是通过管道传递的内容在这两种情况下都使用了 CR LF。
-
(Get-Content input.txt) |将单个字符串(带有换行符)传递给管道,Get-Content input.txt |将多个字符串传递给管道(其中每个字符串代表一行)之间存在很大差异。请注意,如果您将其传递给变量 (String[]),它可能会被空格或换行符分隔,具体取决于您的显示方式。另请注意,对于后面的语法,您的my-program需要能够process管道中的每个单独项目。鉴于您问题中的详细信息,我怀疑您的程序是否真的在这样做。 -
你在 powershell 控制台,而不是 ise 或 vscode 或 windows 终端?
-
@user 当 PowerShell 输出到外部程序(大多数 .exe 文件)时,
$OutputEncoding用于确定编码。您可以在执行命令之前尝试$OutputEncoding = [System.Text.UTF8Encoding]::new($false)。
标签: powershell encoding pipe byte-order-mark