2008-09-10 46 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); 
     } 
    } 
}