将命令行unicode参数传递给Java代码

Pan*_*wal 14 java unicode command-line-arguments

我必须将日语命令行参数传递给Java main方法.如果我在命令行窗口中键入Unicode字符,它会显示"?????" 这没关系,但传递给java程序的值也是'?????'.如何获取命令窗口传递的参数的正确值?下面是示例程序,它将命令行参数提供的值写入文件.

public static void main(String[] args) {
        String input = args[0];
        try {
            String filePath = "C:/Temp/abc.txt";
            File file = new File(filePath);
            OutputStream out = new FileOutputStream(file);
            byte buf[] = new byte[1024];
            int len;
            InputStream is = new ByteArrayInputStream(input.getBytes());
            while ((len = is.read(buf)) > 0) {
                out.write(buf, 0, len);
            }
            out.close();
            is.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
Run Code Online (Sandbox Code Playgroud)

bob*_*nce 14

遗憾的是,您不能将非ASCII字符与使用Windows C运行时的stdlib的命令行应用程序(如Java)(以及几乎所有非Windows特定的脚本语言)一起使用.

这是因为默认情况下,他们使用特定于语言环境的代码页读取输入和输出,这不是UTF,与使用UTF-8的其他所有现代操作系统不同.

虽然您可以使用该chcp命令将终端的代码页更改为其他内容,但对UTF-8编码的支持chcp 65001会在几个方面被破坏,这些方式可能导致应用程序崩溃.

如果您只需要日语,则可以通过将区域设置("区域设置中的非Unicode应用程序的语言")设置为日本来切换到代码页932(类似于Shift-JIS).但是,对于不在该代码页中的字符,这仍然会失败.

如果需要在Windows上通过命令行可靠地获取非ASCII字符,则需要直接调用Win32 API函数GetCommandLineW以避免编码到系统代码页面层.可能你想用JNA做到这一点.


Ser*_*kov 5

遗憾的是,标准Java启动程序在Windows上处理Unicode命令行参数时存在已知且长期存在的错误.也许在其他一些平台上.对于Java 7更新1,它仍然存在.

如果你擅长用C/C++编程,你可以尝试编写自己的启动器.一些专门的启动器可能不是什么大问题...只需在JNI Invocation API页面上看到初始示例.

另一种可能性是使用Java包装器和临时文件的组合将Unicode参数传递给Java应用程序.请参阅我的博客Java,Xalan,Unicode命令行参数...以获取更多注释和包装器代码.


Mob*_*Mob -1

该问题是由于您的系统区域设置造成的。将您的语言环境更改为日语,就可以了。

以下是如何执行此操作http://www.java.com/en/download/help/locale.xml