You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中使用replace()去除WMIC输出异常字符的问题求助

解决wmic输出乱码导致的ÿ字符问题

这个问题我之前也碰到过,核心原因是wmic命令的输出编码是UTF-16LE,但Java默认会用系统默认编码(比如GBK、UTF-8)去读取输入流,导致字节解码错误,把原本的空格变成了ÿ这类乱码字符。直接在cmd里正常是因为cmd会自动识别UTF-16编码,导出到txt时记事本也能正确解析,但Java没做这个自动识别。

下面给你两种无需写入文件的解决方法:

方法一:读取时指定正确的编码

这是最根本的解决方式,从源头上避免乱码。在创建InputStreamReader时,明确指定UTF-16LE编码:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;

public class WmicOsInfo {
    public static void main(String[] args) throws Exception {
        Process process = new ProcessBuilder("wmic", "os", "get", "Caption").start();
        // 指定UTF-16LE编码读取wmic的输出流
        BufferedReader reader = new BufferedReader(
            new InputStreamReader(process.getInputStream(), StandardCharsets.UTF_16LE)
        );
        
        String line;
        StringBuilder cleanResult = new StringBuilder();
        while ((line = reader.readLine()) != null) {
            // 过滤空行和标题行("Caption")
            String trimmedLine = line.trim();
            if (!trimmedLine.isEmpty() && !trimmedLine.equals("Caption")) {
                cleanResult.append(trimmedLine);
            }
        }
        reader.close();
        process.waitFor();
        
        String osInfo = cleanResult.toString();
        System.out.println("正确的系统信息:" + osInfo);
        // 现在可以直接和预期字符串做比对了
    }
}

方法二:修复已乱码的字符串

如果已经读取了包含ÿ的乱码字符串,可以通过重新编码的方式回溯修复:

// 假设result是已经读取到的乱码字符串
byte[] wrongEncodedBytes = result.getBytes(StandardCharsets.ISO_8859_1);
String correctedResult = new String(wrongEncodedBytes, StandardCharsets.UTF_16LE);
// 此时correctedResult就是正确的系统信息字符串

原理是:Java把UTF-16LE的字节用ISO-8859-1解码时,会保留原始字节的映射;我们再把这些字节用正确的UTF-16LE编码重新解码,就能还原出原本的字符串。

另外提一句,你之前用的replace("(?i)windows.", "Windows ")完全没命中问题点——这个正则是替换不区分大小写的"windows."(末尾的点是正则通配符)成"Windows ",和ÿ字符毫无关系,所以肯定无效。

内容的提问来源于stack exchange,提问作者z3r0

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:14:16