2010-05-25 11 views
7

Ho bisogno di ottenere l'output dell'applicazione nativa in PowerShell. Il problema è che l'output è codificato con UTF-8 (senza distinta materiali), che PowerShell non riconosce e converte semplicemente quei caratteri funky UTF direttamente in Unicode.: accettazione UTF-8

Ho trovato che PowerShell ha variabile $OutputEncoding, ma non sembra influire sui dati di input.

Anche l'icona di buon vecchio non serve a nulla, poiché questa conversione UTF8-as-if-ASCII => Unicode non necessaria avviene prima che il prossimo membro della pipeline acquisisca i dati.

+0

puoi dare un esempio di ciò che il vostro cercando di ottenere? La risposta potrebbe essere diversa se stai usando i file o se vuoi solo mostrare alcuni dati sullo schermo ... –

+0

Come potrei renderlo più chiaro? "./program-that-outputs-utf8> 1.txt" - non funziona, "./program-that-outputs-utf8 | out-file -enc utf8 1.txt" - non funziona neanche. Il programma esatto e i dati esatti non ti diranno nulla. – Andy

+2

Questo commento rende più chiaro. –

risposta

12

vedo il problema ora con il programma qui di seguito (stdout.cpp - stdout.cpp cl):

#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]); 
    }     
} 

E in esecuzione che, attraverso | Out-File -enc UTF8 foo.txt dà l'incomprensibile:

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

noti che Fhex è un'utilità PSCX.

UPDATE: capito come arrivare a questo lavoro:

$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

Com'è semplice :) Questo esempio mostra che in alcuni casi è necessario conoscere .NET. La semplice conoscenza elegante non è abbastanza ... – stej

-2

Se il vostro obiettivo è quello di elaborare i dati dal vostro native command in PowerShell, si può provare

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

Questo non funziona. Guardate, powershell inizia a decodificare tutti i dati dal programma-che-uscite-utf8 come se fosse ASCII, dando in effetti un linguaggio gergale UTF (e non i caratteri reali che questo linguaggio senza senso rappresenta) nelle stringhe _UNICODE_. Quindi, se uso l'operatore ">", codificherà _THAT_ gibberish in UTF-16. – Andy

0

Probabry è necessario eseguire "65001 chcp" (dopo aver modificato carattere di PowerShell.exe).
Questo comando è disponibile con PSISE.