Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java、UTF-8和Windows控制台_Java_Windows_Utf 8_Console - Fatal编程技术网

Java、UTF-8和Windows控制台

Java、UTF-8和Windows控制台,java,windows,utf-8,console,Java,Windows,Utf 8,Console,我们尝试在Windows上使用Java和UTF-8。应用程序在控制台上写入日志,我们希望对日志使用UTF-8,因为我们的应用程序具有国际化日志 可以使用-Dfile.encoding=UTF-8作为JVM的参数,配置JVM以生成UTF-8。它工作正常,但Windows控制台上的输出是乱码的 然后,我们可以将控制台的代码页设置为65001(chcp 65001),但在这种情况下,.bat文件不起作用。这意味着,当我们试图通过脚本(名为start.bat)启动应用程序时,绝对不会发生任何事情。命令s

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

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

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

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

C:\Application>
但是如果没有chcp 65001,就没有问题,应用程序也可以启动


有什么提示吗?

您是否尝试过使用旧的cmd.exe而不是旧的cmd.exe。

尝试
chcp 65001&&start.bat


chcp
命令更改代码页,65001是Windows 7及更高版本下UTF-8的Win32代码页标识符。代码页或字符编码指定如何将Unicode代码点转换为字节序列或再次转换为字节序列。

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

我的月食还是这样。两者都能很好地工作。

Windows不支持65001代码页:

默认情况下,Windows上的Java不支持unicode输出。我通过使用JNA库调用本机API编写了一个变通方法。该方法将在控制台上为unicode输出调用WriteConsoleW

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

文件start.bat的文本编码是什么?似乎是向后退了一步,坚持(并修改)iso-8859-1而不是utf-8。但可能您有自己的原因。PowerShell仍然使用同一个控制台,因此它与cmd.exe一样陈旧和垃圾。这必须与-Dfile.encoding=UTF-8一起使用才能正常工作。@AxelFontaine我尝试使用-Dfile.encoding=UTF-8,但使用平方根符号时,符号后的最后两个数字会重复。例如,代替
√125
输出将是
√12525
它开始用Windows 7支持它。