实际上,所使用的字符集tasklist
总是与系统默认值不同。
另一方面,只要输出限制为ASCII ,使用默认值是非常安全的。通常可执行模块的名称中只有 ASCII 字符。
因此,要获得正确的字符串,您必须将 (ANSI) Windows 代码页转换为 OEM 代码页,并将后者作为字符集传递给InputStreamReader
.
这些编码之间似乎没有全面的映射。可以使用以下映射:
Map<String, String> ansi2oem = new HashMap<String, String>();
ansi2oem.put("windows-1250", "IBM852");
ansi2oem.put("windows-1251", "IBM866");
ansi2oem.put("windows-1252", "IBM850");
ansi2oem.put("windows-1253", "IBM869");
Charset charset = Charset.defaultCharset();
String streamCharset = ansi2oem.get(charset.name());
if (streamCharset) {
streamCharset = charset.name();
}
InputStreamReader isr = new InputStreamReader(p.getInputStream(),
streamCharset);
这种方法对我windows-1251
很有效IBM866
。
要获取 Windows 使用的当前 OEM 编码,可以使用GetOEMCP
function。返回值取决于区域和语言控制面板中管理选项卡上非 Unicode 程序的语言设置。需要重新启动才能应用更改。
Windows 上有两种编码:ANSI和OEM。
前者由在 GUI 模式下运行的非 Unicode 应用程序使用。
后者由控制台应用程序使用。控制台应用程序无法显示当前 OEM 编码中无法表示的字符。
由于tasklist
是控制台模式应用程序,其输出始终采用当前的 OEM 编码。
对于英文系统,这对通常是Windows-1252和CP850。
由于我在俄罗斯,我的系统具有以下编码:Windows-1251和CP866。
如果我将输出捕获tasklist
到文件中,则文件无法正确显示西里尔字符:
在记事本中查看时,我得到ЏаЁўҐв
而不是Привет
(嗨!) 。
并µTorrent
显示为зTorrent
。
您不能更改tasklist
.
但是,可以更改cmd
. 如果您将/u
switch 传递给它,它将以 UTF-16 编码输出所有内容。
cmd /c echo Hi>echo.txt
的大小echo.txt
为 4 个字节:两个字节用于Hi
换行,两个字节用于换行(\r
和\n
)。
cmd /u /c echo Hi>echo.txt
现在 的大小echo.txt
是 8 个字节:每个字符用两个字节表示。