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

问题描述 投票:0回答:1

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

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

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

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

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

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

powershell encoding codepages cjk
1个回答
0
投票

基于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();

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

© www.soinside.com 2019 - 2024. All rights reserved.