为什么PowerShell文件连接会将UTF8转换为UTF16?

11

我正在运行以下Powershell脚本,将一系列输出文件合并成一个CSV文件。文件名为whidataXX.htm(其中xx是两位数字),创建的文件数量会因每次运行而异。

$metadataPath = "\\ServerPath\foo" 

function concatenateMetadata {
    $cFile = $metadataPath + "whiconcat.csv"
    Clear-Content $cFile
    $metadataFiles = gci $metadataPath
    $iterations = $metadataFiles.Count
    for ($i=0;$i -le $iterations-1;$i++) {
        $iFile = "whidata"+$i+".htm"
        $FileExists = (Test-Path $metadataPath$iFile -PathType Leaf)
        if (!($FileExists))
        {
            break
        }
        elseif ($FileExists)
        {
            Write-Host "Adding " $metadataPath$iFile
            Get-Content $metadataPath$iFile | Out-File $cFile -append
            Write-Host "to" $cfile
        }
    }
} 
whidataXX.htm 文件采用 UTF8 编码,但我的输出文件采用 UTF16 编码。当我在记事本中查看文件时,它显示正确,但当我在十六进制编辑器中查看时,每个字符之间都会出现十六进制值 00,并且当我将文件导入 Java 程序进行处理时,控制台会在 c h a r a c t e r s 之间打印额外的空格。

首先,这是 PowerShell 的正常行为吗?还是源文件中有什么原因导致这种情况?

其次,我应该如何在上述代码中解决这个编码问题?


1
在 Powershell 6.0 中,这已经变得不必要了 - Powershell 现在默认为 UTF-8,无需编码进行重定向。请参见 https://github.com/PowerShell/PowerShell/issues/4878 - kumarharsh
2个回答

17

Out-File等“Out-*”命令将数据格式化,其默认格式为unicode。

您可以向Out-file添加一个“-Encoding”参数:

Get-Content $metadataPath$iFile | Out-File $cFile -Encoding UTF8 -append

或切换到Add-Content,它不会重新格式化

Get-Content $metadataPath$iFile | Add-Content $cFile 

确认一下,Add-Content 只是将新数据附加到现有文件中,对吗? - dwwilson66
是的。它的对应命令 Set-Content 将会覆盖现有数据。 - mjolinor
3
在Powershell 6.0中,这已变得不再必要——现在Powershell默认使用UTF-8编码进行重定向,无需手动编码。请参见https://github.com/PowerShell/PowerShell/issues/4878。 - kumarharsh

1

感谢提供这篇文章的参考! - dwwilson66

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接