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
+15
@@ -3,6 +3,7 @@ using System.IO;
|
||||
using System.Net;
|
||||
using System.Net.Http;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
using Gott.Endpoints;
|
||||
using Gott.Middleware;
|
||||
using Gott.Services;
|
||||
@@ -13,6 +14,20 @@ using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.FileProviders;
|
||||
using Microsoft.Extensions.Hosting;
|
||||
|
||||
// Auf Windows: Console-Codepage des Server-Prozesses auf UTF-8 erzwingen.
|
||||
// Wirkt prozess-global (Win32 SetConsoleOutputCP/SetConsoleCP) und wird von
|
||||
// direkt gestarteten Child-Prozessen geerbt – damit Tools/Sub-Prozesse, die
|
||||
// die Console-Codepage abfragen, UTF-8 als Output-Encoding nutzen.
|
||||
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
|
||||
{
|
||||
try
|
||||
{
|
||||
Console.OutputEncoding = Encoding.UTF8;
|
||||
Console.InputEncoding = Encoding.UTF8;
|
||||
}
|
||||
catch { /* In Service-Kontexten ohne Console kann das werfen – ignorieren. */ }
|
||||
}
|
||||
|
||||
var builder = WebApplication.CreateBuilder(args);
|
||||
|
||||
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
|
||||
|
||||
@@ -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