如何从 Windows 上的 Java 控制台应用程序确定当前活动的代码页?

How to determine the currently active code page from a Java console application on Windows?

这是一个简单的 Java 应用程序,它在 Windows:

上显示 默认代码页
package doscommand;

import java.io.IOException;
import java.io.InputStream;

public class DosCommand {

    public static void main(String[] args) throws IOException {

        InputStream in = Runtime.getRuntime().exec("chcp.com").getInputStream();
        int ch;
        StringBuilder chcpResponse = new StringBuilder();
        while ((ch = in.read()) != -1) {
            chcpResponse.append((char) ch);
        }
        System.out.println(chcpResponse); // For example: "Active code page: 437"
    }
}

在我的 Windows 10 机器上,此应用程序始终显示 "Active code page: 437",因为 Cp437 是默认设置,并且Runtime.getRuntime().exec() 在 运行 chcp.com 时开始新的 Process

是否可以创建一个 Java 应用程序来显示现有 命令提示符 当前活动代码页 window 其中代码为 运行?

我希望能够通过 命令提示符 执行类似的操作:

chcp 1252
java -jar "D:\NB82\DosCommand\dist\DosCommand.jar" REM Shows current code page is "1252".

chcp 850
java -jar "D:\NB82\DosCommand\dist\DosCommand.jar" REM  Shows current code page is "850".

How do you specify a Java file.encoding value consistent with the underlying Windows code page? 问了一个类似的问题,尽管在那种情况下 OP 正在寻求非 Java 解决方案。

我更喜欢仅 Java 的解决方案,但作为替代方案:

解决方案原来只是一行代码。 Using JNA, the value returned by the Windows API function GetConsoleCP() 给出控制台的活动代码页:

import com.sun.jna.platform.win32.Kernel32;

public class JnaActiveCodePage {

    public static void main(String[] args) {
        System.out.println("" + JnaActiveCodePage.getActiveInputCodePage());
    }

    /**
     * Calls the Windows function GetConsoleCP() to get the active code page using JNA.
     * "jna.jar" and "jna-platform.jar" must be on the classpath.
     *
     * @return the code page number.
     */
    public static int getActiveInputCodePage() {
        return Kernel32.INSTANCE.GetConsoleCP();
    }
}