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
相关产品推荐
相关产品推荐

