fix(encoding): UTF-8 prozess-global + 16-KB-StreamReader für CLI-Output

Zwei zusätzliche Härtungen gegen intermittierende �-Replacement-Chars
(Umlaute, Em-Dash) im CLI-Output unter Windows:

- Program.cs: Auf Windows Console.OutputEncoding/InputEncoding = UTF-8
  setzen. Wirkt prozess-global via Win32 SetConsoleOutputCP/SetConsoleCP
  und wird von direkt gestarteten Child-Prozessen geerbt – ergänzt den
  bestehenden chcp-65001-cmd-Wrapper. In try/catch, falls als Windows-
  Dienst ohne Console gestartet.
- ClaudeCliService.cs: stdout-Lesen mit eigenem StreamReader (16-KB-
  Buffer, explizit UTF-8 ohne BOM-Detection) statt Default-Reader (1 KB).
  Verhindert, dass bei gefragmentierten Pipe-Reads Multi-Byte-UTF-8-
  Sequenzen über Buffer-Grenzen aufgesplittet werden und der Decoder
  den State verliert.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
MelekiandClaude Opus 4.7 committed 2026-04-26 16:12:24 +02:00
1 parent bfd550e090
commit e75c4370fd
2 files changed
+25 -1

No files matched your search

+10 -1
View File
@@ -337,7 +337,16 @@ public class ClaudeCliService
await process.StandardInput.FlushAsync();
process.StandardInput.Close();
using var reader = process.StandardOutput;
// Eigener StreamReader mit großem Buffer + explizit UTF-8 ohne BOM-Detection.
// Default-Reader (process.StandardOutput) nutzt nur 1 KB Buffer, was bei
// gefragmentierten Pipe-Reads zu zerschnittenen Multi-Byte-UTF-8-Sequenzen
// und damit zu �-Replacement-Chars für Umlaute/Em-Dashes führen kann.
using var reader = new StreamReader(
process.StandardOutput.BaseStream,
new UTF8Encoding(encoderShouldEmitUTF8Identifier: false),
detectEncodingFromByteOrderMarks: false,
bufferSize: 16384,
leaveOpen: false);
string line;
while ((line = await reader.ReadLineAsync(cancellationToken)) != null)
{