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 来说是否正常?或者源文件中有什么东西会导致这种情况?

其次,我将如何解决上述代码中的这个编码问题?

4

2 回答 2

16

Out-* cmdlet(如 Out-File)格式化数据,默认格式为 unicode。

您可以将 -Encoding 参数添加到 Out-file:

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

或切换到不会重新格式化的添加内容

Get-Content $metadataPath$iFile | Add-Content $cFile 
于 2013-10-15T18:29:15.740 回答
2

首先,每个字符获得 2 个字节的事实表明正在使用固定长度的 UTF16。更准确地说,它被称为 UCS-2。本文解释了 Powershell 中的文件重定向导致输出位于 UCS-2 中。请参阅http://www.kongsli.net/nblog/2012/04/20/powershell-gotchas-redirect-to-file-encodes-in-unicode/。同一篇文章也提供了修复。

于 2013-10-15T18:41:33.043 回答