14

Windows では Java と UTF-8 を使用するようにしています。アプリケーションはコンソールにログを書き込みます。このアプリケーションには国際化されたログがあるため、ログに UTF-8 を使用したいと考えています。

-Dfile.encoding=UTF-8JVMへの引数として使用して、UTF-8 を生成するように JVM を構成することができます。問題なく動作しますが、Windows コンソールの出力が文字化けします。

次に、コンソールのコード ページを 65001 ( chcp 65001) に設定できますが、この場合、.batファイルは機能しません。これは、スクリプト (start.bat という名前) を使用してアプリケーションを起動しようとしても、まったく何も起こらないことを意味します。コマンドの単純な戻り値:

C:\Application> chcp 65001
Activated code page: 65001
C:\Application> start.bat

C:\Application>

がなくchcp 65001ても問題なく、アプリケーションを起動できます。

それについてのヒントはありますか?

4

5 に答える 5

9

試すchcp 65001 && start.bat

このchcpコマンドはコード ページを変更します。65001 は、Windows 7 以降での UTF-8 の Win32 コード ページ識別子です。コード ページまたは文字エンコーディングは、Unicode コード ポイントを一連のバイトに変換する方法、またはその逆の方法を指定します。

于 2008-09-10T20:55:48.570 に答える
7

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);
        }
    }
}
于 2012-01-19T05:35:31.453 に答える
0

Windowsは65001コードページをサポートしていません: http: //www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/chcp.mspx? mfr = true

于 2011-09-30T13:01:32.300 に答える
0

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

私の日食はまだこのようなものです。どちらもうまく機能します。

于 2008-11-05T16:32:56.770 に答える
-4

古い cmd.exe ではなくPowerShellを試しましたか。

于 2008-09-10T20:36:51.657 に答える