diff --git a/src/integrations/terminal/Terminal.ts b/src/integrations/terminal/Terminal.ts index 3a2abdd2bb..bfeae3e8f8 100644 --- a/src/integrations/terminal/Terminal.ts +++ b/src/integrations/terminal/Terminal.ts @@ -165,11 +165,6 @@ export class Terminal extends BaseTerminal { LC_ALL: "en_US.UTF-8", } - // On Windows, set the code page to UTF-8 (65001) for proper Unicode support - if (process.platform === "win32") { - env.CHCP = "65001" - } - // Set Oh My Zsh shell integration if enabled if (Terminal.getTerminalZshOhMy()) { env.ITERM_SHELL_INTEGRATION_INSTALLED = "Yes" diff --git a/src/integrations/terminal/TerminalProcess.ts b/src/integrations/terminal/TerminalProcess.ts index eb0424fe8d..fe45f2f427 100644 --- a/src/integrations/terminal/TerminalProcess.ts +++ b/src/integrations/terminal/TerminalProcess.ts @@ -114,9 +114,21 @@ export class TerminalProcess extends BaseTerminalProcess { (defaultWindowsShellProfile === null || (defaultWindowsShellProfile as string)?.toLowerCase().includes("powershell")) - if (isPowerShell) { - let commandToExecute = command + let commandToExecute = command + // On Windows, prepend chcp 65001 to set UTF-8 code page for proper Unicode support + // This fixes issues with non-ASCII characters being displayed as "?" or diamond symbols + if (process.platform === "win32") { + if (isPowerShell) { + // PowerShell syntax: use semicolon to chain commands and redirect output to null + commandToExecute = `chcp 65001 > $null ; ${command}` + } else { + // CMD syntax: use && to chain commands and redirect output to nul + commandToExecute = `chcp 65001 > nul && ${command}` + } + } + + if (isPowerShell) { // Only add the PowerShell counter workaround if enabled if (Terminal.getPowershellCounter()) { commandToExecute += ` ; "(Roo/PS Workaround: ${this.terminal.cmdCounter++})" > $null` @@ -126,12 +138,10 @@ export class TerminalProcess extends BaseTerminalProcess { if (Terminal.getCommandDelay() > 0) { commandToExecute += ` ; start-sleep -milliseconds ${Terminal.getCommandDelay()}` } - - terminal.shellIntegration.executeCommand(commandToExecute) - } else { - terminal.shellIntegration.executeCommand(command) } + terminal.shellIntegration.executeCommand(commandToExecute) + this.isHot = true // Wait for stream to be available diff --git a/src/integrations/terminal/__tests__/TerminalRegistry.spec.ts b/src/integrations/terminal/__tests__/TerminalRegistry.spec.ts index 0d18ca24ec..657433f23a 100644 --- a/src/integrations/terminal/__tests__/TerminalRegistry.spec.ts +++ b/src/integrations/terminal/__tests__/TerminalRegistry.spec.ts @@ -126,40 +126,5 @@ describe("TerminalRegistry", () => { Terminal.setTerminalZshP10k(false) } }) - - it("adds CHCP=65001 on Windows for UTF-8 support", () => { - // Mock platform as Windows - const originalPlatform = process.platform - Object.defineProperty(process, "platform", { - value: "win32", - writable: true, - configurable: true, - }) - - try { - TerminalRegistry.createTerminal("/test/path", "vscode") - - expect(mockCreateTerminal).toHaveBeenCalledWith({ - cwd: "/test/path", - name: "Roo Code", - iconPath: expect.any(Object), - env: { - PAGER: "", - VTE_VERSION: "0", - PROMPT_EOL_MARK: "", - LANG: "en_US.UTF-8", - LC_ALL: "en_US.UTF-8", - CHCP: "65001", - }, - }) - } finally { - // Restore original platform - Object.defineProperty(process, "platform", { - value: originalPlatform, - writable: true, - configurable: true, - }) - } - }) }) })