Вопрос

Мы стараемся использовать Java и UTF-8 в Windows.Приложение записывает журналы в консоль, и мы хотели бы использовать для журналов UTF-8, поскольку наше приложение имеет интернационализированные журналы.

Можно настроить JVM так, чтобы она генерировала UTF-8, используя -Dfile.encoding=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, проблем нет, и приложение можно запускать.

Есть какие-нибудь намеки на это?

Это было полезно?

Решение

Пытаться chcp 65001 && start.bat

Другие советы

Java в Windows НЕ поддерживает вывод Юникода по умолчанию.Я написал обходной метод, вызвав Native API с библиотекой JNA. Этот метод будет вызывать 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

Попытался ли ты PowerShell а не старый cmd.exe.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top