Как подключить Unicode к родному приложению в PowerShell

У меня есть родная программа, написанная на Python, которая ожидает его ввода на stdin. В качестве простого примера,

#!python3 import sys with open('foo.txt', encoding='utf8') as f: f.write(sys.stdin.read()) 

Я хочу иметь возможность передать строку (PowerShell) этой программе в качестве стандартного ввода. Python ожидает своего стандартного ввода в кодировке, указанной в $env:PYTHONIOENCODING , которую я обычно устанавливаю в UTF8 (так что я не получаю ошибок в кодировке).

Но независимо от того, что я делаю, персонажи развращаются. Я искал сеть и нашел предложения по изменению [Console]::InputEncoding / [Console]::OutputEncoding или использовать chcp , но ничего не работает.

Вот мой основной тест:

 PS >[Console]::OutputEncoding.EncodingName Unicode (UTF-8) PS >[Console]::InputEncoding.EncodingName Unicode (UTF-8) PS >$env:PYTHONIOENCODING utf-8 PS >python -c "print('\N{Euro sign}')" | python -c "import sys; print(sys.stdin.read())" ´╗┐? PS >chcp 1252 Active code page: 1252 PS >python -c "print('\N{Euro sign}')" | python -c "import sys; print(sys.stdin.read())" ? PS >chcp 65001 Active code page: 65001 PS >python -c "print('\N{Euro sign}')" | python -c "import sys; print(sys.stdin.read())" ? 

Как я могу исправить эту проблему?

Я даже не могу объяснить, что здесь происходит. В принципе, мне нужен тест ( python -c "print('\N{Euro sign}')" | python -c "import sys; print(sys.stdin.read())" ), чтобы распечатать знак Euro. И чтобы понять, почему , я должен делать все, что нужно, чтобы заставить это работать 🙂 (Потому что тогда я могу перевести эти знания в свой реальный сценарий, который должен иметь возможность писать рабочие конвейеры программ Python, которые не ломаются когда они сталкиваются с символами Unicode).

Благодаря mike z, следующие работы:

 $OutputEncoding = [Console]::OutputEncoding = (new-object System.Text.UTF8Encoding $false) $env:PYTHONIOENCODING = "utf-8" python -c "print('\N{Euro sign}')" | python -c "import sys; print(sys.stdin.read())" 

new-object необходим для получения кодировки UTF-8 без спецификации . $OutputEncoding переменную $OutputEncoding и [Console]::OutputEncoding .

Я до сих пор не полностью понимаю разницу между двумя значениями кодировки и почему вы когда-либо устанавливали их по-разному (по-видимому, по умолчанию).