2008-09-10 6 views
10

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

Возможно настроить JVM, чтобы он генерировал UTF-8, используя -Dfile.encoding=UTF-8 в качестве аргументов JVM. Он отлично работает, но вывод на консоли Windows искажен.

Затем мы можем установить кодовую страницу консоли на 65001 (chcp 65001), но в этом случае файлы .bat не работают. Это означает, что когда мы пытаемся запустить наше приложение через наш скрипт (named start.bat), абсолютно ничего не происходит. Команда просто возвращает:

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

C:\Application> 

Но без chcp 65001, нет никаких проблем, и приложение может быть запущено.

Любые намеки об этом?

+0

Что такое текстовое кодирование файла start.bat? – johnstok 2008-11-05 14:40:57

ответ

6

Попробуйте chcp 65001 && start.bat

+0

Это необходимо использовать в сочетании с -Dfile.encoding = UTF-8 для правильной работы. – 2014-04-29 14:11:48

+0

@AxelFontaine Я попытался использовать -Dfile.encoding = UTF-8, но при использовании символа квадратного корня, последние 2 числа после символа будут повторяться. Например, вместо `√125` вывод будет` √12525` – Cj1m 2014-10-11 11:21:58

-4

Вы пытались PowerShell, а не старый cmd.exe.

+1

PowerShell по-прежнему использует ту же консоль, поэтому она такая же старая и дерьмовая, как cmd.exe. – Trejkaz 2013-05-28 03:22:01

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 

Мое затмение все еще такое. Оба хорошо работают.

6

Java на окнах не поддерживает юникод вывода по умолчанию. Я написал метод обхода путем вызова Native API с библиотекой JNA. Метод вызовет WriteConsoleW для вывода unicode на консоли.

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); 
     } 
    } 
}