2013-10-15 6 views
6

Я запускаю следующий сценарий Powershell, чтобы объединить ряд выходных файлов в один файл CSV. whidataXX.htm (где xx - двухзначный порядковый номер), а количество создаваемых файлов варьируется от запуска до запуска.Почему конкатенация файлов Powershell конвертирует UTF8 в UTF16?

$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. Когда я просматриваю файл в «Блокноте», он выглядит правильно, но когда я его просматриваю в Hex-редакторе, между каждым символом появляется значение Hex 00, и когда я вытаскиваю файл в программу Java для обработки, файл печатает на консоль с дополнительными пробелами между c h a r a c t e r s.

Во-первых, это нормально для PowerShell? или есть что-то в исходных файлах, которые могли бы вызвать это?

Во-вторых, как я могу исправить эту проблему кодирования в коде, отмеченном выше?

ответ

12

Out-* cmdlets (как Out-File) форматируют данные, а формат по умолчанию - unicode.

Вы можете добавить -Кодирование параметр Out-файл:

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

или перейти к Add-Content, который не переформатировать

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

И чтобы подтвердить, добавление-контент просто добавит новые данные в существующий файл, правильно? – dwwilson66

+0

Да. Это аналог Set-Content будет перезаписывать существующие данные. – mjolinor

2

Во-первых, тот факт, что вы получить 2 байта на символ указывает, что используется фиксированная длина UTF16. Точнее, это называется UCS-2. В этой статье объясняется, что перенаправление файлов в Powershell вызывает вывод в UCS-2. См. http://www.kongsli.net/nblog/2012/04/20/powershell-gotchas-redirect-to-file-encodes-in-unicode/. Эта же статья также содержит исправление.

+0

Спасибо за ссылку на статью! – dwwilson66

Смежные вопросы