2010-05-25 11 views
7

Potrzebuję uzyskać wyjściową aplikację natywną w PowerShell. Problem polega na tym, że dane wyjściowe są zakodowane za pomocą UTF-8 (bez BOM), który PowerShell nie rozpoznaje i po prostu konwertuje te funky znaków UTF bezpośrednio na kod Unicode.Kodowanie wejściowe: akceptowanie UTF-8

Znalazłem PowerShell ma zmienną $OutputEncoding, ale nie wpływa na dane wejściowe.

Dobre ikony "ol" również nie są pomocne, ponieważ ta niepotrzebna konwersja UTF8-as-if-ASCII => Unicode ma miejsce, zanim następny członek potoku uzyska dane.

+0

możesz dać próbkę tego, co próbujesz osiągnąć? Odpowiedź może być inna, jeśli używasz plików lub chcesz wyświetlić tylko niektóre dane na ekranie ... –

+0

W jaki sposób mogę uczynić to bardziej zrozumiałym? "./program-that-outputs-utf8> 1.txt" - nie działa, "./program-that-outputs-utf8 | out-file -enc utf8 1.txt" - też nie działa. Dokładny program i dokładne dane nic ci nie powiedzą. – Andy

+2

Ten komentarz czyni go bardziej przejrzystym. –

Odpowiedz

12

widzę problemu teraz z programem poniżej (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]); 
    }     
} 

i działa, że ​​dzięki | Out-File -enc UTF8 foo.txt daje bełkot:

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      ......... 

Zauważ, że fhex to narzędzie PSCX.

UPDATE: zorientowali się, jak uzyskać to do pracy:

$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

Jak łatwo :) Ten przykład pokazuje, że w niektórych przypadkach naprawdę trzeba znać .NET. Tylko wykształcona wiedza to za mało ... – stej

-2

Jeśli twoim celem jest, aby przetwarzać dane z rodzimej polecenia PowerShell, można spróbować

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

To nie działa. W skrócie, funkcja PowerShell dekoduje wszystkie dane z programu-that-outputs-utf8, jakby były w formacie ASCII, co skutecznie nadaje bełkotowi UTF (a nie rzeczywistym postaciom, które ten bełkot reprezentuje) w ciągach _UNICODE_. Następnie, jeśli użyję operatora ">", zakoduje _THAT_ bełkot w UTF-16. – Andy

0

Probabry trzeba wykonać „chcp 65001” (po zmianie czcionki powershell.exe za).
To polecenie jest dostępne w PSISE.