首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java不识别Windows 11上path中的Unicode字符

Java不识别Windows 11上path中的Unicode字符
EN

Stack Overflow用户
提问于 2022-09-09 17:25:00
回答 1查看 375关注 0票数 3

在启用Beta: Use Unicode UTF-8 for worldwide language support选项时,Java无法识别Unicode字符。

我的用户文件夹的路径是C:\Users\Otávio Augusto Silvaá字符给java带来了一些麻烦。通过调用javac命令(如果JDK是使用scoop install安装在我的用户文件夹中),它将给出以下结果:

代码语言:javascript
复制
Erro: Não é possível carregar a classe principal com.sun.tools.javac.Main no módulo jdk.compiler
        java.lang.UnsatisfiedLinkError: no jimage in system library path: C:\Users\Otávio Augusto Silva\scoop\apps\zulu-jdk\current\bin

注意,它将á字符替换为á

如果通过使用scoop install -gchoco install或任何JDK发行版中的默认安装程序全局安装,这些命令可以正常工作,但是如果我调用并传递整个路径,则会产生一个错误:

代码语言:javascript
复制
C:\Users\Otávio Augusto Silva>javac "C:\Users\Otávio Augusto Silva\Documents\Code\Java\Hello World\main.java"
error: file not found: C:\Users\Otávio Augusto Silva\Documents\Code\Java\Hello World\main.java
Usage: javac <options> <source files>
use --help for a list of possible options

若要复制,请执行以下操作:

  • 有一个带有Unicode拉丁字符的用户文件夹(类似于áéã等)
  • 启用区域中的Beta: Use Unicode UTF-8 for worldwide language support设置
  • 安装您最喜欢的JDK发行版
  • 调用javac,像C:\Users\USERFOLER\PATH\TO\FILE\file.java一样传递整个路径

应该会出现错误。

我被困在这里面好几天了,如果有人能帮我的话,我会非常感激的。

一些相关信息:

  • 我在Windows终端应用程序中使用cmd,但是PowerShell给出了同样的错误
  • chcp命令给出代码65001
  • 我已经试过了这里的解决方案,但没有成功
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-16 20:20:33

使用您的目录名(Otávio Augusto Silva),我也可以使用Java 18在Windows 10上再现您的问题。不幸的是,这看起来像是这个开放和未解决的JDK错误中记录的一个更普遍和更长期存在的问题的具体例子:

JDK-4488646 Java可执行文件和系统属性需要在Windows上支持Unicode

这是bug报告的一部分,我的重点是:

要使Java完全识别NT上的Unicode,我们需要

  1. 修改系统属性、初始化代码和使用Windows调用在NT上使用wide-char调用的所有其他位置。
  2. 修改java、javac等,以便能够在类路径和其他命令行参数中使用Unicode。

那个错误报告是在2001年创建的!它与Windows有关,但是由于它仍然是开放的和未解决的,所以我认为它对所有类型的Windows都具有普遍适用性,包括Windows 10和11。

备注:

  • 尽管它无助于解决您的具体问题,但是使用JNA在Java应用程序中(如上面的bug描述所述)中“使用wide-char调用”是相当简单的。例如,如果从Java向应用程序传递了一个参数,您的代码就可以成功地处理Otávio Augusto Silva。有关代码,请参见这就是答案
  • 还请参阅2015年提出的开放和未解决的JDK bug报告WindowsJDK-8124977 cmdline编码挑战。讨论了在java上使用cmd窗口和PowerShell窗口的区别。

========================================================

(此更新基于@ based 16320675的注释。)

这个问题似乎在Java19 (从这里下载)中完全解决了,它将于本月晚些时候发布。屏幕截图如下:

  • 当使用JDK 19时,对javac的调用将成功。
  • 在使用JDK 18时,对javac的相同调用将失败,因为文件名D:\Otávio...被处理为D:\Otávio...

我找不到关于这个修复在JDK 19发行说明中的任何提及。

========================================================

(此更新显示如果未启用beta选项会发生什么情况。)

如果选项Beta: Use Unicode UTF-8 for worldwide language support未启用,则无法重现问题;对javac的调用使用JDK 18和JDK 19都能正常工作:

请注意,即使cmd窗口中的代码页为437,而不是65001,这仍然有效。当然,在你的环境和我的环境之间有几个显著的区别:

  • 你在使用Windows 11,我使用Windows 10。
  • 我的系统环境是英语(美国),我认为你的系统是不同的。

总结一下如何解决这个问题:

  • 除非您由于某些特定原因启用了beta选项,否则请考虑禁用它。
  • 如果希望保持启用该选项,请考虑升级到Java 19。

========================================================

更新:在Java 19中修复了以下错误:

8272352:当系统区域设置为UTF-8 #530时,Java启动程序无法解析汉字。

虽然该bug修复特别涉及传递给 Java 的文件名,但我认为它可能解释了为什么OP与javac的问题也在Java 19中得到了解决。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73665603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档