2008-09-10 10 views
10

Wir versuchen, Java und UTF-8 unter Windows zu verwenden. Die Anwendung schreibt Protokolle auf der Konsole und wir möchten UTF-8 für die Protokolle verwenden, da unsere Anwendung über internationalisierte Protokolle verfügt.Java, UTF-8 und Windows-Konsole

Es ist möglich, die JVM so zu konfigurieren, dass UTF-8 mit -Dfile.encoding=UTF-8 als Argumente für die JVM generiert wird. Es funktioniert gut, aber die Ausgabe auf einer Windows-Konsole ist verstümmelt.

Dann können wir die Codepage der Konsole auf 65001 (chcp 65001) setzen, aber in diesem Fall funktionieren die .bat Dateien nicht. Das heißt, wenn wir versuchen, unsere Anwendung über unser Skript (namens start.bat) zu starten, geschieht absolut nichts. Der Befehl einfache Rückgabe:

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

C:\Application> 

Aber ohne chcp 65001, gibt es kein Problem, und die Anwendung kann gestartet werden.

Irgendwelche Hinweise dazu?

+0

Wie lautet die Textkodierung der Datei start.bat? – johnstok

Antwort

6

Versuchen chcp 65001 && start.bat

+0

Dies muss in Verbindung mit -Dfile.encoding = UTF-8 verwendet werden, um ordnungsgemäß zu funktionieren. –

+0

@AxelFontaine Ich versuchte mit -Dfile.encoding = UTF-8, aber wenn Sie das Quadratwurzel-Symbol verwenden, würden die letzten 2 Zahlen nach dem Symbol wiederholen. ZB anstelle von '√125' würde der Ausgang' √12525' sein. – Cj1m

-4

Haben Sie versucht, PowerShell anstelle von alten cmd.exe.

+1

PowerShell immer noch die gleiche Konsole, so ist es genauso alt und Mist wie cmd.exe. – Trejkaz

0

Wir in Linux einige ähnliche Probleme hatten. Unser Code war in ISO-8859-1 (hauptsächlich cp-1252-kompatibel), aber die Konsole war UTF-8, wodurch der Code nicht kompiliert wurde. Wenn Sie einfach die Konsole in ISO-8859-1 ändern, wird das Build-Skript in UTF-8 unterbrochen. Wir haben ein paar Möglichkeiten gefunden:
1- definieren Sie einige Standard-Codierung und klebrig zu. Das war unsere Entscheidung. Wir haben uns dafür entschieden, alles in ISO-8859-1 zu behalten und die Build-Skripte zu modifizieren.
2- Festlegen der Codierung vor dem Starten einer Aufgabe, auch innerhalb der Build-Skripts. Ein Code wie der Erickson sagte. In Linux war wie:

lang=pt_BR.ISO-8859-1 /usr/local/xxxx 

Meine Eclipse noch so ist. Beides funktioniert gut.

+0

Scheint wie ein Schritt rückwärts zu kleben (und Dinge zu modifizieren) zu iso-8859-1 statt utf-8. Aber wahrscheinlich hatten Sie Ihre Gründe. – KarolDepka

6

Java auf Windows Unicode nicht ouput standardmäßig unterstützen. Ich habe eine Problemumgehungsmethode geschrieben, indem ich Native API mit JNA-Bibliothek aufgerufen habe. Die Methode ruft WriteConsoleW für die Unicode-Ausgabe auf der Konsole auf.

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