在rust中执行命令行输出中文乱码解决办法
如果你使用标准的依赖库执行命令中包含中文的话, 就会发现中文乱码,如果你的输出中没有中文,就可以正常输出,因为windows的命令行默认使用的是gbk编码。。。。。
#[tauri::command]
pub async fn run_command(command: String) -> Result<String, String> {#[cfg(target_os = "windows")]let output = {// 先设置控制台编码为UTF-8let _ = 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"
完整代码:
#[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-8let (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())}}
}