2016-06-11 14 views
10

Tạo một tệp utf8.txt. Đảm bảo mã hóa là UTF-8 (không có BOM). Đặt nội dung của nó để Làm thế nào để cat một tập tin UTF-8 (không có BOM) đúng/toàn cầu trong PowerShell?

Trong cmd.exe:

type utf8.txt > out.txt

Nội dung out.txt

Trong PowerShell (v4):

cat .\utf8.txt > out.txt

hoặc

type .\utf8.txt > out.txt

nội dung out.txt là €

Làm thế nào để làm cho công việc trên toàn cầu PowerShell chính xác?

Trả lời

12

của Windows PowerShell, không giống như các nền tảng .NET framework [1] , sử dụng giá trị mặc định sau:

  • trên đầu vào: file mà không có một BOM (byte dấu thứ tự) được giả định là trong mã hóa mặc định của hệ thống ing, đó là di sảnWindows code page ("ANSI" trang mã: mã hóa hoạt động, văn hóa cụ thể byte đơn, như cấu hình thông qua Control Panel).

  • trên đầu ra: các nhà khai thác >>> chuyển hướng sản xuất UTF-16 LE file theo mặc định (mà ta có - và nhu cầu - một BOM).

cmdlet file tốn và -producing làm thường hỗ trợ một -Encoding tham số cho phép bạn chỉ định mã hóa một cách rõ ràng.
Trước PowerShell v5.1, sử dụng lệnh ghép ngắn bên dưới Out-File cơ bản là cách duy nhất để thay đổi mã hóa.
Trong PowerShell v5.1 +, >>> trở thành bí danh có hiệu lực Out-File, cho phép bạn thay đổi hành vi của mã hóa >>> qua biến $PSDefaultParameterValues sở thích; ví dụ:
$PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'.

Đối với PowerShell để xử lý UTF-8 đúng cách, bạn phải xác định nó như là cả mã hoá đầu vào và đầu ra [2] , nhưng lưu ý rằng trên đầu ra, PowerShell luôn bổ sung thêm một BOM sang UTF-8 các tập tin.

Áp dụng cho ví dụ của bạn:

Get-Content -Encoding utf8 .\utf8.txt | Out-File -Encoding utf8 out.txt 

Để tạo một file UTF-8 mà không một BOM trong PowerShell, xem this answer của tôi.


Ngược lại, PowerShell Lõi, các cross-platform ấn bản của PowerShell, may mắn thay mặc định là BOM-less UTF-8 trên cả trong và đầu ra.


[1] Khuôn khổ .NET sử dụng UTF-8 theo mặc định, cả cho trong và đầu ra.
Sự khác biệt có chủ ý - này trong hành vi giữa PowerShell và khung .NET được xây dựng trên là khác thường.

[2] Get-Content hiện, tuy nhiên, tự động nhận file UTF-8 với một BOM.

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