问题 Java,UTF-8和Windows控制台


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

可以配置JVM,以便使用它生成UTF-8 -Dfile.encoding=UTF-8 作为JVM的参数。它工作正常,但Windows控制台上的输出是乱码。

然后,我们可以将控制台的代码页设置为65001(chcp 65001),但在这种情况下, .bat 文件不起作用。这意味着当我们尝试通过我们的脚本(名为start.bat)启动我们的应用程序时,绝对没有任何反应。命令simple返回:

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

C:\Application>

但没有 chcp 65001,没有问题,应用程序可以启动。

关于那的任何提示?


7126
2017-09-10 18:30


起源

start.bat文件的文本编码是什么? - johnstok


答案:


尝试 chcp 65001 && start.bat


7
2017-09-10 20:55



这必须与-Dfile.encoding = UTF-8一起使用才能正常工作。 - Axel Fontaine
@AxelFontaine我尝试使用-Dfile.encoding = UTF-8但是当使用平方根符号时,符号后面的最后2个数字会重复。例如,而不是 √125 输出将是 √12525 - Cj1m


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

7
2018-01-19 05:35





我们在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

我的日食仍然是这样的。两者都运作良好。


0
2017-11-05 16:32



看起来像是向后退一步(以及修改东西)到iso-8859-1而不是utf-8。但可能你有理由。 - KarolDepka


Windows不支持65001代码页: http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/chcp.mspx?mfr=true


0
2017-09-30 13:01





你有没有尝试过 电源外壳 而不是旧的cmd.exe。


-4
2017-09-10 20:36



PowerShell仍然使用相同的控制台,因此它与cmd.exe一样旧。 - Trejkaz