2010-05-25 23 views
7

Necesito obtener la salida de la aplicación nativa en PowerShell. El problema es que la salida está codificada con UTF-8 (sin BOM), que PowerShell no reconoce y simplemente convierte esos funky caracteres UTF directamente en Unicode.Codificación de entrada: aceptando UTF-8

He encontrado que PowerShell tiene $OutputEncoding variable, pero no parece afectar los datos de entrada.

Good ol 'iconv tampoco es de ayuda, ya que esta conversión innecesaria de UTF8-as-if-ASCII => Unicode tiene lugar antes de que el siguiente miembro de la canalización adquiera datos.

+0

¿Puede dar un ejemplo de lo que su tratando de lograr? La respuesta puede ser diferente si está usando archivos o si solo desea mostrar algunos datos en la pantalla ... –

+0

¿Cómo podría dejarlo más claro? "./program-that-outputs-utf8> 1.txt" - no funciona, "./program-that-outputs-utf8 | out-file -enc utf8 1.txt" - tampoco funciona. El programa exacto y la información exacta no le dirán nada. – Andy

+2

Ese comentario lo deja más claro. –

Respuesta

12

veo el problema ahora con el siguiente programa (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]); 
    }     
} 

Y corriendo que a través de | Out-File -enc UTF8 foo.txt da galimatías:

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

Tenga en cuenta que fhex es una utilidad PSCX.

ACTUALIZACIÓN: descubierto la manera de conseguir que esto funcione:

$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

Qué simple :) Este ejemplo muestra que, en algunos casos, uno realmente necesita saber .NET. El conocimiento elegante no es suficiente ... – stej

-2

Si su objetivo es procesar los datos de su nativa de comandos en PowerShell, puede intentar

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

Esto no funciona. Mire, inicialmente PowerShell decodifica todos los datos de program-that-outputs-utf8 como si fuera ASCII, dando efectivamente galimatías UTF (y no caracteres reales que este galimatías representa) en cadenas de caracteres _UNICODE_. Entonces, si uso el operador ">", codificará _THAT_ galimatías en UTF-16. – Andy

0

Probabry es necesario ejecutar "65001 chcp" (después de modificar la fuente de powershell.exe).
Este comando está disponible con PSISE.

Cuestiones relacionadas