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

时间:2018-01-12 06:00:42

标签: powershell encoding codepages cjk

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

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

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

然而,当我尝试通过tee命令行管道输入内容时,要在控制台上查看它并同时将其提供给文件,我得到了"·····。 ··エ·オヲ·ケ··セ···ュ"代替。

最好我可以告诉它在被输出到控制台之间被重新编码为其他东西,并被送入tee ....所以我该怎么做才能解决这个问题?或者有什么东西能比开球更好吗?

(我也注意到我从第三方下载管理器输入发球台的东西,直到它出现在屏幕上有明显延迟。它会暂停一段时间,显示几个屏幕爆裂,暂停一会儿,再显示几个屏幕,等等)

1 个答案:

答案 0 :(得分:0)

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

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

请记住,.Net内部的所有字符串都是Unicode(代码页1200)。如果有代码页1200无法表示的字形可以用代码页50222表示,则可能会出现问题。

尝试使用Tee-Object和StreamWriter复制ForEach-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();

但我真正的怀疑是,你可能最终必须努力让系统接受这种编码的输入并正确对待它。