2008-09-10 92 views
10

我們嘗試在Windows上使用Java和UTF-8。應用程序在控制檯上寫入日誌,並且我們希望爲日誌使用UTF-8,因爲我們的應用程序具有國際化日誌。Java,UTF-8和Windows控制檯

可以使用-Dfile.encoding=UTF-8作爲JVM的參數來配置JVM,以便生成UTF-8。它工作正常,但在Windows控制檯上的輸出是亂碼。

然後,我們可以將控制檯的代碼頁設置爲65001(chcp 65001),但在這種情況下,.bat文件不起作用。這意味着,當我們嘗試通過我們的腳本(名爲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個數字會重複。 E.g而不是`√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 

我的eclipse仍然是這樣的。兩者都運作良好。

6

的Java默認不支持Unicode輸出中。我通過調用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); 
     } 
    } 
}