質問

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 ではなく。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top