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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将Powershell中的输入/输出编码强制转换为特定的区域设置/代码页?相关的知识,希望对你有一定的参考价值。

使用日语命名的文件,并且无法正确处理编码。跑完之后

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

我可以在控制台上正确地查看日语,并看到“【お题箱】琴浦さん”之类的东西,它在dir列表中表现得很好;当将其重定向到文件时,它会正确存储。

但是,当我尝试通过tee命令行管道输入东西时,要在控制台上看到它并同时将它提供给一个文件,我得到了“·········エ·オヲ·ケ··セ··ュ·“而不是。

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

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

答案

基于Get-Help Tee-Object -Full,该命令始终使用Unicode(即UTF-16 LE或代码页1200)编码。代码页50222(iso-2022-jp /日语(JIS-Allow 1字节Kana-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();

不过,我真正怀疑的是,你最终可能需要非常努力地让系统接受这种编码的输入并正确对待它。

以上是关于将Powershell中的输入/输出编码强制转换为特定的区域设置/代码页?的主要内容,如果未能解决你的问题,请参考以下文章

将PowerShell的默认输出编码更改为UTF-8

[libmpg123强制浮点输出,当我使用整数编码读取mp3时

javaIO流之字节到字符流的转换流

将两列强制转换为 R 中的 1 列因子和 1 列对应值用于数据框

Powershell:将分数转换为整数 - 令人惊讶的舍入行为

如何将日期时间从 PowerShell 输出转换为 yyyy-MM-dd HH:mm:ss 格式