Java,UTF-8和Windows控制台

我们尝试在Windows上使用Java和UTF-8。 应用程序将日志写入控制台,并且我们希望使用UTF-8作为日志,因为我们的应用程序具有国际化日志。

可以使用-Dfile.encoding=UTF-8作为JVM的参数来configurationJVM,使其生成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 ,没有问题,应用程序可以启动。

有关于此的任何提示?

尝试chcp 65001 && start.bat

Windows上的Java默认不支持unicode输出。 我已经编写了一个解决方法,方法是使用JNA库调用Native API。该方法将在控制台上调用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 coreel32 INSTANCE = null; public interface coreel32 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 = (coreel32) Native .loadLibrary("kernel32", coreel32.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中,修改构建脚本。
在开始任何任务之前,即使在构建脚本中,也要设置编码。 像埃里克森说的一些代码。 在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。