Как определить текущую активную кодовую страницу из консольного приложения Java в Windows? - PullRequest
0 голосов
/ 23 февраля 2019

Это простое 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() запускает новый Process при запуске chcp.com.

Возможно ли создать приложение Java, которое вместо этого отображает текущая активная кодовая страница для существующего Командная строка окно, в котором выполняется код?

Я хочу иметь возможность сделать что-то подобное из Командная строка :

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".

Как указать значение Java file.encoding в соответствии с базовой кодовой страницей Windows? задал похожий вопрос, хотя в этом случаеOP искал решение, не относящееся к Java.

Я бы предпочел решение только на Java, но в качестве альтернативы:

  • Можно ли это сделать с помощью JNI, вызвав некоторый C/ C ++ / C # код с доступом к Windows API?Вызываемый код должен только возвращать числовое значение для активной кодовой страницы.
  • Я приму ответ, который убедительно утверждает, что это невозможно сделать.

1 Ответ

0 голосов
/ 24 февраля 2019

Решение оказалось всего одной строкой кода. При использовании 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

...