如何修复Java args无法从Windows资源管理器中正确获取字符串中的日语字符?

在Windows 10上,我在";SendTo";目录中有一个快捷方式文件。它是.BAT文件的快捷方式。

在.bat文件中只能有命令"python <filepath> %*""java -jar <filepath> %*"

当我从Windows资源管理器中选择并右键单击文件并将其发送到此快捷方式文件时,它将使用所选文件作为参数从<filepath>运行程序。

我正在尝试发送文件名包含日语字符作为参数的文件。文件名会很好地传递给Python程序,但对于Java程序,文件名的ARG会混乱,并且Java程序找不到该文件。

例如,在Java和地区为日本的情况下,Filename ファイル名.txt的文件名在参数中变为Filename 繝輔ぃ繧、繝ォ蜷�.txt。其他区域设置也不起作用。如果我先将args发送到python,然后再从python发送到Java,结果是一样的。

如何使Java获得正确的文件名或可以正确地找到文件?


解决方案

您遇到了一个未解决的Java问题。请参阅开放错误JDK-8124977 cmdline encoding challenges on Windows,该错误合并了几个与从命令行向Java应用程序传递Unicode参数相关的问题。

Java 18(将于下个月发布)通过实现JEP 400: UTF-8 by Default解决了一些UTF-8问题,但不幸的是,具体不是您的问题。来自JEP400的目标和目标:

  1. 在整个标准Java API中使用UTF-8进行标准化,除了控制台I/O。[强调我的]

但是,有一种解决方法。参见Netbeans Chinese characters in java project properties run arguments,特别是this answer,它成功地处理了使用JNA(Java Native Access)作为命令行参数传递的中文字符。根据该答案:

JNA允许您从Java调用Windows API方法,而无需使用 本机代码。因此,在Java应用程序中,您可以调用Win API方法 如GetCommandLineW()和CommandLineToArgvW()直接访问 有关用于调用程序的命令行的详细信息,包括 传递的任何参数。这两种方法都支持Unicode。

因此该答案中的代码不会直接读取传递给main()的参数。相反,它使用JNA调用Win API方法来访问它们。

当该代码处理作为参数从命令行传递的中文字符时,它同样适用于日语字符,包括您的日语文件名。

相关文章