Java、UTF-8、および Windows コンソール
質問
Windows 上で Java と UTF-8 を使用しようとします。アプリケーションはコンソールにログを書き込みます。アプリケーションには国際化されたログがあるため、ログには UTF-8 を使用したいと考えています。
次を使用して、UTF-8 を生成するように JVM を構成することができます。 -Dfile.encoding=UTF-8
JVM への引数として。正常に動作しますが、Windows コンソールの出力が文字化けします。
次に、コンソールのコード ページを 65001 に設定できます (chcp 65001
) ですが、この場合、 .bat
ファイルは機能しません。これは、スクリプト (start.bat という名前) を通じてアプリケーションを起動しようとしても、まったく何も起こらないことを意味します。コマンド simple は次を返します。
C:\Application> chcp 65001
Activated code page: 65001
C:\Application> start.bat
C:\Application>
でもそれがなければ chcp 65001
, 問題なくアプリが起動できます。
それについて何かヒントはありますか?
解決
試す chcp 65001 && start.bat
他のヒント
Windows 上の Java は、デフォルトでは Unicode 出力をサポートしません。JNA ライブラリを使用してネイティブ API を呼び出すことで回避策メソッドを作成しました。このメソッドは、コンソール上で Unicode 出力を行うために WriteConsoleW を呼び出します。
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference;
import com.sun.jna.win32.StdCallLibrary;
/** For unicode output on windows platform
* @author Sandy_Yin
*
*/
public class Console {
private static Kernel32 INSTANCE = null;
public interface Kernel32 extends StdCallLibrary {
public Pointer GetStdHandle(int nStdHandle);
public boolean WriteConsoleW(Pointer hConsoleOutput, char[] lpBuffer,
int nNumberOfCharsToWrite,
IntByReference lpNumberOfCharsWritten, Pointer lpReserved);
}
static {
String os = System.getProperty("os.name").toLowerCase();
if (os.startsWith("win")) {
INSTANCE = (Kernel32) Native
.loadLibrary("kernel32", Kernel32.class);
}
}
public static void println(String message) {
boolean successful = false;
if (INSTANCE != null) {
Pointer handle = INSTANCE.GetStdHandle(-11);
char[] buffer = message.toCharArray();
IntByReference lpNumberOfCharsWritten = new IntByReference();
successful = INSTANCE.WriteConsoleW(handle, buffer, buffer.length,
lpNumberOfCharsWritten, null);
if(successful){
System.out.println();
}
}
if (!successful) {
System.out.println(message);
}
}
}
Linux でも同様の問題がいくつかありました。私たちのコードは ISO-8859-1 (主に cp-1252 互換) でしたが、コンソールは UTF-8 だったので、コードはコンパイルできませんでした。コンソールを ISO-8859-1 に変更するだけでは、UTF-8 のビルド スクリプトが壊れてしまいます。いくつかの選択肢が見つかりました。
1- いくつかの標準エンコーディングを定義し、それに固執します。それが私たちの選択でした。ビルド スクリプトを変更して、すべてを ISO-8859-1 に維持することを選択します。
2- ビルド スクリプト内であっても、タスクを開始する前にエンコーディングを設定します。エリクソンが言ったようなコード。Linuxでは次のようになりました:
lang=pt_BR.ISO-8859-1 /usr/local/xxxx
私の日食はまだこんな感じです。どちらもうまく機能します。
Windows は 65001 コード ページをサポートしていません。 http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/chcp.mspx?mfr=true
やってみました パワーシェル 古い cmd.exe ではなく。