如何修复Java args无法从Windows资源管理器中正确获取字符串中的日语字符?
在Windows 10上,我在";SendTo";目录中有一个快捷方式文件。它是.BAT文件的快捷方式。
在.bat文件中只能有命令"python <filepath> %*"
或"java -jar <filepath> %*"
。
当我从Windows资源管理器中选择并右键单击文件并将其发送到此快捷方式文件时,它将使用所选文件作为参数从<filepath>
运行程序。
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的目标和目标:
- 在整个标准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方法来访问它们。
当该代码处理作为参数从命令行传递的中文字符时,它同样适用于日语字符,包括您的日语文件名。
相关文章