
如果你使用标准的依赖库执行命令中包含中文的话, 就会发现中文乱码,如果你的输出中没有中文,就可以正常输出,因为windows的命令行默认使用的是gbk编码。。。。。
rust
#[tauri::command]
pub async fn run_command(command: String) -> Result<String, String> {
#[cfg(target_os = "windows")]
let output = {
// 先设置控制台编码为UTF-8
let _ = tokio::process::Command::new("powershell")
.arg("-Command")
.arg("chcp 65001 | Out-Null")
.creation_flags(0x08000000)
.status()
.await;
tokio::process::Command::new("powershell")
.arg("-Command")
.arg(&command)
.creation_flags(0x08000000)
.output()
.await
.map_err(|e| e.to_string())?
};
#[cfg(not(target_os = "windows"))]
let output = tokio::process::Command::new("sh")
.arg("-c")
.arg(&command)
.output()
.await
.map_err(|e| e.to_string())?;
if output.status.success() {
print!(
"Command output: {}",
String::from_utf8_lossy(&output.stdout)
);
Ok(String::from_utf8_lossy(&output.stdout).to_string())
} else {
Err(String::from_utf8_lossy(&output.stderr).to_string())
}
}
解决办法
使用标准的编码依赖库encoding_rs = "0.8"
完整代码:
rust
#[tauri::command]
pub async fn run_command(command: String) -> Result<String, String> {
#[cfg(target_os = "windows")]
let output = tokio::process::Command::new("powershell")
.arg("-Command")
.arg(&command)
.creation_flags(0x08000000)
.output()
.await
.map_err(|e| e.to_string())?;
#[cfg(not(target_os = "windows"))]
let output = tokio::process::Command::new("sh")
.arg("-c")
.arg(&command)
.output()
.await
.map_err(|e| e.to_string())?;
if output.status.success() {
#[cfg(target_os = "windows")]
{
// 在Windows上尝试从GBK转换为UTF-8
let (decoded, _, _) = GBK.decode(&output.stdout);
Ok(decoded.into_owned())
}
#[cfg(not(target_os = "windows"))]
{
Ok(String::from_utf8_lossy(&output.stdout).to_string())
}
} else {
#[cfg(target_os = "windows")]
{
let (decoded, _, _) = GBK.decode(&output.stderr);
Err(decoded.into_owned())
}
#[cfg(not(target_os = "windows"))]
{
Err(String::from_utf8_lossy(&output.stderr).to_string())
}
}
}
