mirror of
https://github.com/QwenLM/qwen-code.git
synced 2025-12-19 09:33:53 +00:00
fix: character encoding corruption when executing the /copy command on Windows. (#1069)
Co-authored-by: linda <hxn@163.com>
This commit is contained in:
@@ -13,6 +13,7 @@ import {
|
|||||||
isSlashCommand,
|
isSlashCommand,
|
||||||
copyToClipboard,
|
copyToClipboard,
|
||||||
getUrlOpenCommand,
|
getUrlOpenCommand,
|
||||||
|
CodePage,
|
||||||
} from './commandUtils.js';
|
} from './commandUtils.js';
|
||||||
|
|
||||||
// Mock child_process
|
// Mock child_process
|
||||||
@@ -188,7 +189,10 @@ describe('commandUtils', () => {
|
|||||||
|
|
||||||
await copyToClipboard(testText);
|
await copyToClipboard(testText);
|
||||||
|
|
||||||
expect(mockSpawn).toHaveBeenCalledWith('clip', []);
|
expect(mockSpawn).toHaveBeenCalledWith('cmd', [
|
||||||
|
'/c',
|
||||||
|
`chcp ${CodePage.UTF8} >nul && clip`,
|
||||||
|
]);
|
||||||
expect(mockChild.stdin.write).toHaveBeenCalledWith(testText);
|
expect(mockChild.stdin.write).toHaveBeenCalledWith(testText);
|
||||||
expect(mockChild.stdin.end).toHaveBeenCalled();
|
expect(mockChild.stdin.end).toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -7,6 +7,23 @@
|
|||||||
import type { SpawnOptions } from 'node:child_process';
|
import type { SpawnOptions } from 'node:child_process';
|
||||||
import { spawn } from 'node:child_process';
|
import { spawn } from 'node:child_process';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Common Windows console code pages (CP) used for encoding conversions.
|
||||||
|
*
|
||||||
|
* @remarks
|
||||||
|
* - `UTF8` (65001): Unicode (UTF-8) — recommended for cross-language scripts.
|
||||||
|
* - `GBK` (936): Simplified Chinese — default on most Chinese Windows systems.
|
||||||
|
* - `BIG5` (950): Traditional Chinese.
|
||||||
|
* - `LATIN1` (1252): Western European — default on many Western systems.
|
||||||
|
*/
|
||||||
|
export const CodePage = {
|
||||||
|
UTF8: 65001,
|
||||||
|
GBK: 936,
|
||||||
|
BIG5: 950,
|
||||||
|
LATIN1: 1252,
|
||||||
|
} as const;
|
||||||
|
|
||||||
|
export type CodePage = (typeof CodePage)[keyof typeof CodePage];
|
||||||
/**
|
/**
|
||||||
* Checks if a query string potentially represents an '@' command.
|
* Checks if a query string potentially represents an '@' command.
|
||||||
* It triggers if the query starts with '@' or contains '@' preceded by whitespace
|
* It triggers if the query starts with '@' or contains '@' preceded by whitespace
|
||||||
@@ -80,7 +97,7 @@ export const copyToClipboard = async (text: string): Promise<void> => {
|
|||||||
|
|
||||||
switch (process.platform) {
|
switch (process.platform) {
|
||||||
case 'win32':
|
case 'win32':
|
||||||
return run('clip', []);
|
return run('cmd', ['/c', `chcp ${CodePage.UTF8} >nul && clip`]);
|
||||||
case 'darwin':
|
case 'darwin':
|
||||||
return run('pbcopy', []);
|
return run('pbcopy', []);
|
||||||
case 'linux':
|
case 'linux':
|
||||||
|
|||||||
Reference in New Issue
Block a user