From 2c1a836f1806352a622f03c3a4c40bc13604d6c3 Mon Sep 17 00:00:00 2001 From: xuewenjie Date: Fri, 5 Dec 2025 16:49:26 +0800 Subject: [PATCH] fix: prefer UTF-8 encoding for shell output on Windows when detected --- packages/core/src/utils/systemEncoding.test.ts | 13 +++++++++++++ packages/core/src/utils/systemEncoding.ts | 9 +++++++++ 2 files changed, 22 insertions(+) diff --git a/packages/core/src/utils/systemEncoding.test.ts b/packages/core/src/utils/systemEncoding.test.ts index bb594dd1..61558f38 100644 --- a/packages/core/src/utils/systemEncoding.test.ts +++ b/packages/core/src/utils/systemEncoding.test.ts @@ -391,6 +391,19 @@ describe('Shell Command Processor - Encoding Functions', () => { expect(result).toBe('windows-1252'); }); + it('should prioritize UTF-8 detection over Windows system encoding', () => { + mockedOsPlatform.mockReturnValue('win32'); + mockedExecSync.mockReturnValue('Active code page: 936'); // GBK + + const buffer = Buffer.from('test'); + // Mock chardet to return UTF-8 + mockedChardetDetect.mockReturnValue('UTF-8'); + + const result = getCachedEncodingForBuffer(buffer); + + expect(result).toBe('utf-8'); + }); + it('should cache null system encoding result', () => { // Reset the cache specifically for this test resetEncodingCache(); diff --git a/packages/core/src/utils/systemEncoding.ts b/packages/core/src/utils/systemEncoding.ts index 4f43b24a..d76bdbab 100644 --- a/packages/core/src/utils/systemEncoding.ts +++ b/packages/core/src/utils/systemEncoding.ts @@ -34,6 +34,15 @@ export function getCachedEncodingForBuffer(buffer: Buffer): string { // If we have a cached system encoding, use it if (cachedSystemEncoding) { + // If the system encoding is not UTF-8 (e.g. Windows CP936), but the buffer + // is detected as UTF-8, prefer UTF-8. This handles tools like 'git' which + // often output UTF-8 regardless of the system code page. + if (cachedSystemEncoding !== 'utf-8') { + const detected = detectEncodingFromBuffer(buffer); + if (detected === 'utf-8') { + return 'utf-8'; + } + } return cachedSystemEncoding; }