Кодировка ввода: принимает UTF-8 - PullRequest
7 голосов
/ 25 мая 2010

Мне нужно получить вывод собственного приложения под PowerShell. Проблема в том, что вывод кодируется с помощью UTF-8 (без спецификации), который PowerShell не распознает и просто конвертирует эти классные символы UTF непосредственно в Unicode.

Я обнаружил, что PowerShell имеет переменную $OutputEncoding, но, похоже, она не влияет на входные данные.

Хороший старый iconv также не поможет, так как это ненужное преобразование в кодировку UTF8-as-if-ASCII => Unicode происходит до того, как следующий член конвейера получает данные.

Ответы [ 3 ]

12 голосов
/ 25 мая 2010

Теперь я вижу проблему с программой ниже (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]);
    }                
}

И выполнение этого через | Out-File -enc UTF8 foo.txt дает бессмысленное выражение:

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

Обратите внимание, что fhex - это утилита PSCX .

ОБНОВЛЕНИЕ: Выяснили, как заставить это работать:

$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 голосов
/ 25 мая 2010

Вероятно, вам нужно выполнить "chcp 65001" (после изменения шрифта powershell.exe).
Эта команда доступна с PSISE.

0 голосов
/ 25 мая 2010

Если ваша цель - обработать данные из вашей собственной команды в powershell, вы можете попробовать

./program-that-outputs-utf8 > temp.txt
get-content temp.txt -Encoding utf8 | (do_whatever)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...