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

时间:2019-02-23 04:33:35

标签: java windows jna windows-console codepages

这是一个简单的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计算机上,此应用程序始终显示“活动代码页:437” ,因为 Cp437 是默认设置,并且Runtime.getRuntime().exec()启动一个新的{{ 1}}(运行Process时。

是否可以创建一个Java应用程序,而不是在其中运行代码的现有命令提示符窗口中显示当前活动的代码页

我希望能够通过命令提示符执行以下操作:

chcp.com

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

我更喜欢仅使用Java的解决方案,但可以选择:

  • 是否可以使用JNI通过调用一些可访问Windows API的C / C ++ / C#代码来完成此操作?被调用的代码仅需要为活动代码页返回一个数字值。
  • 我将接受一个有说服力的论点,认为这样做是不可能的。

1 个答案:

答案 0 :(得分:0)

该解决方案仅是一行代码。 Using JNA,Windows API函数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();
    }
}

chcpDemo