强制将 Powershell 中的输入/输出编码强制到特定的区域设置/代码页



处理以日语命名的文件,并且无法正确处理编码。 运行后

chcp 50222 $OutputEncoding = [console]::outputencoding [Console]::OutputEncoding = [Text.Encoding]::GetEncoding(50222)

我可以在控制台上正确查看日语,并看到"【お題箱】琴浦さん"之类的内容,它在dir列表中显示正常; 当将其重定向到文件时,它会正确存储。

但是,当我尝试通过 tee 命令进行管道传输时,要在控制台上查看它并同时将其馈送到文件中,我得到"・・・・。・・・エ・オヲ・ケ・・セ・・ュ・"代替。

我能说的最好的是,它在输出到控制台和被输入tee之间被重新编码为其他东西...... 那么我能做些什么来解决这个问题呢?还是有什么比发球台做得更好的?

(我还注意到,从我拥有的第 3 方下载管理器输入 tee 的内容在它出现在屏幕上之前会有明显的延迟。 它会暂停一段时间,突然显示几个屏幕,暂停一段时间,显示另外几个屏幕,等等(

基于Get-Help Tee-Object -Full,该命令始终使用 Unicode(表示 UTF-16 LE 或代码页 1200(编码。 代码页 50222(iso-2022-jp/日语(JIS-允许 1 字节假名 - SO/SI((也不是Add-ContentOut-File支持的标准编码,因此Add-Content -Passthru的常见解决方法不起作用。 我怀疑您必须使用StreamWriter才能将此编码写入文件。

我也不知道 PowerShell 使用的控制台主机是否真正尊重chcp.exe或者它是否支持代码页 50222。

还要记住,在内部,.Net 中的所有字符串都是 Unicode(代码页 1200(。 如果有些标志符号不能用代码页 1200 表示,而代码页 50222 可以表示,则可能会遇到问题。

尝试使用 ForEach-Object 和 StreamWriter 复制Tee-Object

$Encoding = [System.Text.Encoding]::GetEncoding(50222)
$Append = $true
$StreamWriter = New-Object System.IO.StreamWriter -ArgumentList $OutputFile, $Append, $Encoding
previousCommand.exe | ForEach-Object {
    $StreamWriter.WriteLine($_);
    $_;
}
$StreamWriter.Close();

不过,我真正的怀疑是,您最终可能不得不非常努力地让系统接受此编码的输入并正确处理它。

最新更新