実際、によって使用される文字セットは、システムのデフォルトと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
関数を使用できます。戻り値は、 [地域と言語]コントロールパネルの[管理]タブの[ Unicode以外のプログラムの言語]設定によって異なります。変更を適用するには、再起動が必要です。
Windowsには、 ANSIとOEMの2種類のエンコーディングがあります。
前者は、GUIモードで実行されている非Unicodeアプリケーションによって使用されます。
後者はコンソールアプリケーションで使用されます。コンソールアプリケーションは、現在のOEMエンコーディングで表現できない文字を表示できません。
はコンソールモードアプリケーションであるためtasklist
、その出力は常に現在のOEMエンコーディングになります。
英語のシステムの場合、ペアは通常Windows-1252とCP850です。
私はロシアにいるので、私のシステムには次のエンコーディングがあります:Windows-1251とCP866。の出力をファイル
にキャプチャすると、ファイルにキリル文字を正しく表示できません。tasklist
メモ帳で表示すると、 (Hi!)ЏаЁўҐв
の代わりに表示されます。
そして、として表示されます。Привет
µTorrent
зTorrent
で使用されるエンコーディングを変更することはできませんtasklist
。
ただし、の出力エンコーディングを変更することは可能ですcmd
。スイッチを渡す/u
と、すべてがUTF-16エンコーディングで出力されます。
cmd /c echo Hi>echo.txt
のサイズecho.txt
は4バイトです。Hi
改行(\r
および\n
)の場合は2バイト、改行の場合は2バイトです。
cmd /u /c echo Hi>echo.txt
現在、のサイズecho.txt
は8バイトです。各文字は2バイトで表されます。