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:
1 parent
bfd550e090
commit
e75c4370fd
2 files changed
+25
-1
No files matched your search
@@ -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)
|
||||
{
|
||||
|
||||
Reference in new issue
Block a user