Я прочитал несколько QA по этой проблеме, но никто не дал ответа. Есть обходной путь, о котором я говорю здесь еще раз, но я хочу понять и решить проблему.
Проблема
Проблема в том, что выполнение команды git diff reva revb | Out-File mypatch.patch
в PowerShell создает «символы мусора» вместо, например, Немецкие умлауты (├ñ вместо ä).
Расследование
Когда я выполняю $Env:LESSCHARSET = "utf8"
, как предлагается в некоторых QA, я получаю правильный вывод в терминале, но как только он перенаправляется в файл mypatch.patch
, умляуты (и другие символы) искажаются. Даже git --no-pager diff reva revb
дает правильный вывод в терминале. Но как только вы захотите передать это в файл, это будет неправильно. Вы видите нет, что вы получаете!
Мне кажется, что вход в Out-File
уже искажен, и поэтому установка аргумента -Encoding
ничего не меняет. Не думаю, что здесь виноват Out-File
. Например, команда $mypatch = git diff reva revb
(даже с --no-pager, добавленным перед diff) приводит к переменной, где, например, Символ евро или умляуты выглядят искаженными (é¼ вместо €), когда эта переменная выводится на терминал.
Я пробовал Powershell 5.1 и ядро PowerShell 6.0.4 с открытым исходным кодом в Windows 10 (1709). Я использую git 2.18.0.windows.1. Он отлично работает с командной строкой Windows (cmd), поэтому простой обходной путь - вызвать из консоли PowerShell:
Обходной путь
cmd /c "git diff reva revb > mypatch.patch"
Вопрос
Как это работает только с PowerShell?
Визуально это могло бы избежать конвейера, но он все равно будет использоваться в фоновом режиме. Подозреваю, что результат будет таким же.
Вы могли бы сделать git diff reva revb | Out-File -Encoding "UTF8" mypatch.patch
, но это создаст файл с Спецификация (Byte-Order-Mark). Если это нежелательно, используйте $Utf8NoBom = New-Object System.Text.UTF8Encoding $False; [System.IO.File]::WriteAllLines($MyPath, $MyFile, $Utf8NoBom)
.
@ DarkLite1 Это не решает проблему.
Проблема, похоже, вызвана неправильной настройкой [Console]::OutputEncoding
. Если он не установлен на UTF8, попробуйте установить его: [Console]::OutputEncoding = [System.Text.Encoding]::UTF8
.
Не имеет значения, используете ли вы $Env:LESSCHARSET
, соответственно, я считаю, что он больше не используется.
Напротив, на моей машине (tm) только исправления $Env:LESSCHARSET
достаточно и достаточно для правильного рендеринга вывода git diff
. Параметр OutputEncoding не повреждает, но не устраняет симптом искажения специальных символов (например, <C3><BC>
вместо ü
).
@ojdo Как я уже сказал, он правильно отображается в терминале, но если вы перенаправляете вывод в файл, это мусор, и только настройка в этом ответе устранила проблему для меня.
Вы пытались избежать конвейера:
Out-File -InputObject (git diff reva revb) -Path mypatch.patch -Encoding utf8
?