可以分为两部分:
Windows部分
在Java中,您正在执行Windows命令-在“ Windows Land”中的jvm外部。当Java
Runtime类执行Windows命令时,它将DLL用于控制台,因此出现在Windows中,就像命令在控制台中运行一样。 问:当我 在控制台中
运行C: windows system32 tasklist.exe时,结果的字符编码(Windows术语中的“代码页”)?没有参数的Windows“ chcp”命令给出了控制台的活动代码页号(例如对于Multilingual-Latin-1是850,对于Latin-1是1252)。请参阅Windows Microsoft代码页, Windows OEM代码页, Windows ISO代码页
最初根据系统区域设置来设置默认的系统代码页(键入systeminfo以查看此内容或通过“控制面板”->“区域和语言”)。Windows OS / .NET函数getACP()也提供此信息
- Java部分:
如何从Windows代码页“ x”(例如850或1252)中解码Java字节流?
* Windows代码页号和等效Java字符集名称之间的完整映射可以从[此处](http://msdn.microsoft.com/en-us/library/windows/desktop/dd317756%28v=vs.85%29.aspx)导出[-代码页标识符(Windows)](http://msdn.microsoft.com/en-us/library/windows/desktop/dd317756%28v=vs.85%29.aspx)* 但是,实际上,可以添加以下前缀之一来实现映射:
对于ISO,“”(无),对于OEM,“ IBM”或“ x-IBM”,对于Microsoft,“ windows-”或“ x-windows-” /视窗。
例如ISO-8859-1或IBM850或Windows-1252
完整解决方案:
String cmd = System.getenv("windir") + "\system32\" + "chcp.com"; Process p = Runtime.getRuntime().exec(cmd); // Use default charset here - only want digits which are "core UTF8/UTF16"; // ignore text preceding ":" String windowsCodePage = new Scanner( new InputStreamReader(p.getInputStream())).skip(".*:").next(); Charset charset = null; String[] charsetPrefixes = new String[] {"","windows-","x-windows-","IBM","x-IBM"}; for (String charsetPrefix : charsetPrefixes) { try { charset = Charset.forName(charsetPrefix+windowsCodePage); break; } catch (Throwable t) { } } // If no match found, use default charset if (charset == null) charset = Charset.defaultCharset(); cmd = System.getenv("windir") + "\system32\" + "tasklist.exe"; p = Runtime.getRuntime().exec(cmd); InputStreamReader isr = new InputStreamReader(p.getInputStream(), charset); BufferedReader input = new BufferedReader(isr); // Debugging output System.out.println("matched prepage "+windowsCodePage+" to charset name:"+ charset.name()+" displayName:"+charset.displayName()); String line; while ((line = input.readLine()) != null) {System.out.println(line); }感谢您的提问!- 很有趣。



