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做到这一点.
遗憾的是,标准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
| 归档时间: |
|
| 查看次数: |
8316 次 |
| 最近记录: |