Java,UTF-8和Windows控制台

Java,UTF-8和Windows控制台

Java, UTF-8, and Windows console

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

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

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

1
2
3
4
5
C:\Application> chcp 65001
Activated code page: 65001
C:\Application> start.bat

C:\Application>

但是没有chcp 65001,就没有问题,并且可以启动该应用程序。

有什么暗示吗?


Windows上的Java默认情况下不支持Unicode输出。我通过使用JNA库调用Native API编写了一种解决方法,该方法将调用WriteConsoleW在控制台上输出unicode。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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);
        }
    }
}

尝试chcp 65001 && start.bat


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


我们在Linux中也遇到了类似的问题。我们的代码在ISO-8859-1中(大多数与cp-1252兼容),但是控制台是UTF-8,因此代码无法编译。只需将控制台更改为ISO-8859-1,就可以破坏UTF-8中的构建脚本。我们找到了两个选择:
1-定义一些标准的编码和坚持。那是我们的选择。我们选择将所有内容保留在ISO-8859-1中,并修改构建脚本。
2-在开始任何任务之前设置编码,即使在构建脚本中也是如此。像埃里克森所说的一些代码。在Linux中就像:

1
lang=pt_BR.ISO-8859-1 /usr/local/xxxx

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


您是否尝试过PowerShell,而不是旧的cmd.exe。


推荐阅读

    linux关机命令日志?

    linux关机命令日志?,系统,工作,命令,时间,用户,表示,终端,进程,操作,指令,lin

    归档日志命令linux?

    归档日志命令linux?,数据,工作,公司,位置,代理,信息,日志,对比,最新,系统,Ora

    清空日志命令linux?

    清空日志命令linux?,系统,信息,时间,文件,日志,工作,价值,工具,服务,设备,lin

    linux日志外发命令?

    linux日志外发命令?,系统,信息,时间,数据,服务,公共,实时,位置,情况,日志,Lin

    linux命令怎么控制的?

    linux命令怎么控制的?,地址,工作,系统,标准,命令,电脑,基础,管理,灵活,网站,l

    linux控制台停止命令?

    linux控制台停止命令?,地址,工具,平台,网络,下来,电脑,状态,命令,程序,进程,L

    linux下查看日志命令?

    linux下查看日志命令?,系统,一致,对比,信息,标准,地址,实时,情况,工具,管理,l

    linux命令日志输出?

    linux命令日志输出?,系统,状态,命令,情况,对比,标准,实时,服务,下来,数据,怎

    linux命令查寻日志?

    linux命令查寻日志?,系统,信息,对比,情况,日志,时间,第一,实时,命令,文件,lin

    linux访问日志的命令?

    linux访问日志的命令?,系统,信息,对比,实时,基础,日志,命令,文件,设备,管理,l

    linux命令保存日志?

    linux命令保存日志?,系统,信息,服务,数据,时间,下来,日志,文件,适当,等级,怎

    linux访问日志命令?

    linux访问日志命令?,系统,信息,对比,日志,简介,管理,情况,实时,命令,文件,查

    linux日志搜索命令?

    linux日志搜索命令?,信息,系统,对比,工具,一致,日志,文件,命令,实时,网络,lin

    linux远程日志的命令?

    linux远程日志的命令?,系统,时间,信息,实时,服务,对比,日志,数据,报告,分析,L

    linux命令控制声卡?

    linux命令控制声卡?,软件,检测,设备,工作,声卡,官方网站,标准,电脑,情况,位

    linux中打日志命令?

    linux中打日志命令?,系统,实时,情况,服务,信息,对比,工作,日志,管理,名称,查

    linux作业控制命令?

    linux作业控制命令?,工作,系统,信息,地址,管理,命令,目录,大地,行业,术语,lin

    linux日志查询命令行?

    linux日志查询命令行?,系统,信息,对比,电脑,工具,情况,日志,实时,服务,官网,l

    linux退出控制台命令?

    linux退出控制台命令?,地址,工作,命令,图片,管理,系统,目录,信息,标准,控制

    清楚日志命令linux?

    清楚日志命令linux?,系统,时间,信息,情况,日志,实时,对比,文件,命令,程序,lin