2013-10-15 20 views
6

Tôi đang chạy tập lệnh Powershell sau đây để nối một loạt tệp đầu ra vào một tệp CSV duy nhất. whidataXX.htm (trong đó xx là số có hai chữ số) và số lượng tệp được tạo thay đổi từ chạy đến chạy.Tại sao ghép nối tệp Powershell chuyển đổi UTF8 thành 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 tệp được mã UTF8, nhưng tệp đầu ra của tôi được mã hóa UTF16. Khi tôi xem tệp trong Notepad, nó xuất hiện chính xác, nhưng khi tôi xem nó trong Hex Editor, giá trị Hex 00 xuất hiện giữa mỗi ký tự và khi tôi kéo tệp vào chương trình Java để xử lý, tệp sẽ in ra bảng điều khiển có thêm khoảng cách giữa c h a r a c t e r s.

Đầu tiên, điều này có bình thường đối với PowerShell không? hoặc có cái gì đó trong các tập tin nguồn sẽ gây ra điều này?

Thứ hai, làm cách nào để khắc phục sự cố mã hóa này trong mã được lưu ý ở trên?

Trả lời

12

Các lệnh ghép ngắn Out- * (như Out-File) định dạng dữ liệu và định dạng mặc định là unicode.

Bạn có thể thêm một tham số -Encoding Out-file:

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

hoặc chuyển sang Add-Content, mà không định dạng lại

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

Và để xác nhận, Add-Content sẽ chỉ thêm dữ liệu mới vào tệp hiện có, đúng không? – dwwilson66

+0

Có. Đối tác Set-Content sẽ ghi đè dữ liệu hiện có. – mjolinor

2

Thứ nhất, thực tế là bạn nhận được 2 byte cho mỗi ký tự chỉ ra rằng độ dài cố định UTF16 đang được sử dụng. Chính xác hơn, nó được gọi là UCS-2. Bài viết này giải thích rằng chuyển hướng tệp trong Powershell làm cho đầu ra nằm trong UCS-2. Xem http://www.kongsli.net/nblog/2012/04/20/powershell-gotchas-redirect-to-file-encodes-in-unicode/. Bài viết tương tự cũng cung cấp bản sửa lỗi.

+0

Cảm ơn bạn đã tham khảo bài viết! – dwwilson66

Các vấn đề liên quan