Java 无法识别 Windows 11 路径中的 Unicode 字符

标签 java unicode jvm windows-11 regional-settings

启用 Beta: Use Unicode UTF-8 for worldwide language support 选项后,Java 无法识别 Unicode 字符。
我的用户文件夹的路径是 C:\Users\Otávio Augusto Silvaá 字符给 java 带来了一些麻烦。 如果使用 scoop install 在我的用户文件夹中安装了 JDK,则通过调用 javac 命令,它会给出以下结果:

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 发行版的默认安装程序进行全局安装,这些命令工作正常,但如果我调用并传递整个路径,它给出了一个错误:

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:使用 Unicode UTF-8 支持全局语言
  • 安装您最喜欢的 JDK 发行版
  • 调用 javac 传递整个路径,如 C:\Users\USERFOLER\PATH\TO\FILE\file.java

错误应该会出现。
我已经被困在这几天了,如果有人能帮助我,我将不胜感激。
一些相关信息:

  • 我在 Windows 终端应用程序中使用 cmd,但是 PowerShell 给出了同样的错误
  • chcp 命令给出代码 65001
  • 我已经尝试了提供的解决方案 here , 没用

最佳答案

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

JDK-4488646 Java executable and System properties need to support Unicode on Windows

这是错误报告描述的一部分,我强调了这一点:

To make Java completely Unicode-aware on NT we need to

  1. Modify System properties initialization code and all other places where Windows calls are used to use wide-char calls on NT.

  2. Modify java, javac etc. to be able to use Unicode in classpath and other command line arguments.

该错误报告创建于 2001 年!它与 Windows NT 相关,但由于它仍然开放且未解决,我认为它普遍适用于所有版本的 Windows,包括 Windows 10 和 11。

注意事项:

  • 虽然它无助于解决您的特定问题,但在您的 Java 应用程序中“使用宽字符调用”相当简单(如上面的错误描述中所述)使用 JNA。例如,如果从 Java 向您的应用程序传递参数,您的代码可以成功处理 Otávio Augusto Silva。参见 this SO answer用于执行此操作的代码。

  • 另请参阅 Unresolved JDK 错误报告 JDK-8124977 cmdline encoding challenges on Windows这是在 2015 年提出的。它包括一些关于在 cmdPowerShell Windows 上使用 java 之间的区别的讨论。

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

(此更新基于@user16320675 的评论。)

这个问题似乎在 Java 19 ( download from here ) 中得到了完全解决,该版本将于本月晚些时候发布。从下面的屏幕截图:

  • 使用 JDK 19 时,对 javac 的调用将成功。

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

    javac calls

我找不到关于此修复的任何提及 in the JDK 19 Release Notes .

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

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

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

Beta option not enabled

请注意,即使 cmd 窗口中的代码页是 437 而不是 65001,这仍然有效。当然,您的环境和我的环境之间存在一些显着差异:

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

总结如何解决这个问题:

  • 除非您出于某些特定原因启用了该测试版选项,否则请考虑将其禁用。
  • 如果您想保留该选项,请考虑升级到 Java 19。

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

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

8272352: Java launcher can not parse Chinese character when system locale is set to UTF-8 #530

虽然该错误修复具体涉及传递给 java 的文件名,但我认为这可能解释了为什么 OP 的 javac 问题也在 Java 19 中得到解决。

关于Java 无法识别 Windows 11 路径中的 Unicode 字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73665603/

相关文章:

java - 为什么 JCheckBox 上的 setSelected 会失效?

python - 将包含 COMBINING DIAERESIS 的文本转换为 utf-8

java - 如何通过字符两个字节的电子邮件地址验证输入日语?

java - JVM 是否对 jar 和 war 文件应用任何默认压缩

java - 如何消除 JVM 运行时错误弹出窗口?

eclipse 中的 java.lang.ClassNotFoundException : org. apache.hadoop.hive.jdbc.HiveDriver

java - 从类 : custom methods or reflection? 检索值

java - Java库的访问限制

python - 发送电子邮件时 MIMEText UTF-8 编码问题

java - 如何使用 ASM 控制常量池条目的顺序?