From e17117e027cf8f0aa077c861b707651e040800a0 Mon Sep 17 00:00:00 2001 From: 魏曹先生 <1992414357@qq.com> Date: Fri, 17 Apr 2026 01:10:07 +0800 Subject: Fix Windows UTF-16 argument handling in PowerShell completion --- mingling_core/src/program.rs | 14 +++++++++++++- mingling_core/tmpls/comps/pwsh.ps1 | 9 +++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/mingling_core/src/program.rs b/mingling_core/src/program.rs index bee9772..7ea3a38 100644 --- a/mingling_core/src/program.rs +++ b/mingling_core/src/program.rs @@ -8,7 +8,7 @@ use crate::{ AnyOutput, ChainProcess, RenderResult, asset::dispatcher::Dispatcher, error::ProgramExecuteError, }; -use std::{env, fmt::Display, pin::Pin, sync::OnceLock}; +use std::{fmt::Display, pin::Pin, sync::OnceLock}; #[doc(hidden)] pub mod exec; @@ -74,7 +74,19 @@ where Program { collect: std::marker::PhantomData, group: std::marker::PhantomData, + #[cfg(not(windows))] args: env::args().collect(), + #[cfg(windows)] + args: { + std::env::args_os() + .map(|arg| { + use std::os::windows::ffi::OsStrExt; + + let wide: Vec = arg.encode_wide().collect(); + String::from_utf16_lossy(&wide) + }) + .collect() + }, dispatcher: Vec::new(), stdout_setting: Default::default(), user_context: Default::default(), diff --git a/mingling_core/tmpls/comps/pwsh.ps1 b/mingling_core/tmpls/comps/pwsh.ps1 index c9d9b97..eccb776 100644 --- a/mingling_core/tmpls/comps/pwsh.ps1 +++ b/mingling_core/tmpls/comps/pwsh.ps1 @@ -49,7 +49,16 @@ Register-ArgumentCompleter -Native -CommandName '<<>>' -ScriptBlock { $args += ($element -replace '-', '^') } + $originalEncoding = [Console]::OutputEncoding + $originalPSEncoding = $OutputEncoding + [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 + $OutputEncoding = [System.Text.Encoding]::UTF8 + $output = & <<>> __comp $args 2>&1 + + [Console]::OutputEncoding = $originalEncoding + $OutputEncoding = $originalPSEncoding + $output = $output -replace "`r`n", "`n" -replace "`r", "`n" if (-not $output) { -- cgit