我正在运行以下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来说是正常的吗?或者源文件中是否存在导致此问题的内容?
其次,如何在上述代码中解决此编码问题?
答案 0 :(得分:14)
Out- * cmdlet(如Out-File)格式化数据,默认格式为unicode。
您可以将-Encoding参数添加到Out-file:
Get-Content $metadataPath$iFile | Out-File $cFile -Encoding UTF8 -append
或切换到Add-Content,不会重新格式化
Get-Content $metadataPath$iFile | Add-Content $cFile
答案 1 :(得分:2)
首先,每个字符获得2个字节的事实表明正在使用固定长度UTF16。更准确地说,它被称为UCS-2。本文解释了Powershell中的文件重定向导致输出在UCS-2中。见http://www.kongsli.net/nblog/2012/04/20/powershell-gotchas-redirect-to-file-encodes-in-unicode/。同一篇文章也提供了修复。