2010-05-25 34 views
7

Tôi cần lấy đầu ra của ứng dụng gốc trong PowerShell. Vấn đề là, đầu ra được mã hóa với UTF-8 (không có BOM), mà PowerShell không nhận ra và chỉ chuyển đổi những ký tự UTF sôi nổi đó thành Unicode.Mã hóa đầu vào: chấp nhận UTF-8

Tôi đã tìm thấy PowerShell có biến số $OutputEncoding, nhưng dường như không ảnh hưởng đến dữ liệu đầu vào.

Biểu tượng ol tốt cũng không giúp được gì, vì quá trình chuyển đổi UTF8-as-ASCII => Unicode không cần thiết này diễn ra trước khi thành viên đường ống tiếp theo mua dữ liệu.

+0

Bạn có thể cho một ví dụ về những gì bạn đang cố gắng để đạt được? Câu trả lời có thể khác nếu bạn đang sử dụng tệp hoặc nếu bạn chỉ muốn hiển thị một số dữ liệu trên màn hình ... –

+0

Làm cách nào tôi có thể làm rõ hơn? "./program-that-outputs-utf8> 1.txt" - không hoạt động, "./program-that-outputs-utf8 | out-file -enc utf8 1.txt" - không hoạt động. Chương trình chính xác và dữ liệu chính xác sẽ không cho bạn biết gì. – Andy

+2

Nhận xét đó làm cho nó rõ ràng hơn. –

Trả lời

12

Tôi thấy vấn đề này bây giờ với chương trình dưới đây (stdout.cpp - cl stdout.cpp):

#include <stdio.h> 

void main() 
{ 
    char bytes[] = { 0x41, 0x53, 0x43, 0x49, 
        0x49, 0x20, 0x6F, 0x75, 
        0x74, 0x70, 0x75, 0x74, 
        0xE1, 0xBE, 0xB9}; 

    for (int i = 0; i < 15; i++) 
    { 
     printf("%c", bytes[i]); 
    }     
} 

Và chạy mà qua | Out-File -enc UTF8 foo.txt đưa ra vô nghia:

PS> fhex foo.txt 

Address: 0 1 2 3 4 5 6 7 8 9 A B C D E F ASCII 
-------- ----------------------------------------------- ---------------- 
00000000 EF BB BF 41 53 43 49 49 20 6F 75 74 70 75 74 0D ...ASCII output. 
00000010 9F E2 95 9B E2 95 A3 0D 0A      ......... 

Lưu ý rằng fhex là một tiện ích PSCX.

UPDATE: đặn hiểu làm thế nào để có được điều này để làm việc:

$enc = [Console]::OutputEncoding 
[Console]::OutputEncoding = [text.encoding]::utf8 
.\stdout.exe | out-file fubar3.txt -enc utf8 
fhex .\fubar3.txt 

Address: 0 1 2 3 4 5 6 7 8 9 A B C D E F ASCII 
-------- ----------------------------------------------- ---------------- 
00000000 EF BB BF 41 53 43 49 49 20 6F 75 74 70 75 74 E1 ...ASCII output. 
00000010 BE B9 0D 0A          .... 

[Console]::OutputEncoding = $enc 
+0

Đơn giản như thế nào :) Ví dụ này cho thấy rằng trong một số trường hợp, người ta thực sự cần biết .NET. Chỉ cần kiến ​​thức posh là không đủ ... – stej

-2

Nếu mục tiêu của bạn là để xử lý dữ liệu từ lệnh mẹ đẻ của bạn trong PowerShell, bạn có thể thử

./program-that-outputs-utf8 > temp.txt 
get-content temp.txt -Encoding utf8 | (do_whatever) 
+1

Điều này không hoạt động. Hãy nhìn xem, quyền hạn bắt đầu giải mã tất cả dữ liệu từ chương trình-đầu ra-utf8 như thể nó là ASCII, cho hiệu quả vô nghĩa UTF (và không phải là ký tự thực đại diện vô nghĩa này) trong chuỗi _UNICODE_. Sau đó, nếu tôi sử dụng toán tử ">", nó sẽ mã hóa _THAT_ vô nghĩa trong UTF-16. – Andy

0

Probabry bạn cần phải thực hiện "65001 chcp" (sau khi điều chỉnh phông chữ powershell.exe của).
Lệnh này có sẵn với PSISE.

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