当前位置: 首页 > 知识库问答 >
问题:

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

韩飞翮
2023-03-14

Java无法通过Beta版识别Unicode字符:使用Unicode UTF-8实现全球语言支持选项
我的用户文件夹的路径是C:\Users\Otávio Augusto Silvaá字符给java带来了一些麻烦。如果JDK安装在我的用户文件夹中,使用coop-install调用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

请注意,它将< code>á字符替换为< code >γ。< br >如果使用< code>scoop install -g、< code>choco 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

要重现,请执行以下操作:

    < li >使用带有Unicode拉丁字符的用户文件夹(类似于< code>á、< code>é、< code >γ等)) < li >在区域设置中启用< code>Beta:使用Unicode UTF-8进行全球语言支持 < li >安装您最喜欢的JDK发行版 < li >调用< code>javac,传递完整路径,如< code > C:\ Users \ user foler \ PATH \ TO \ FILE \ FILE . Java

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

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

共有1个答案

柯奕
2023-03-14

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

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

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

要使Java在NT上完全支持Unicode,我们需要

>

  • 修改系统属性初始化代码以及使用 Windows 调用以在 NT 上使用宽字符调用的所有其他位置。

    修改java、javac等以便能够在类路径和其他命令行参数中使用Unicode。

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

    注意事项:

    >

  • 尽管这无助于解决您的特定问题,但使用JNA在Java应用html" target="_blank">程序(如上面的错误描述中所述)中“使用宽字符调用”非常简单。例如,如果从Java向您的应用程序传递了一个参数,那么您的代码可以成功地处理<code>Otávio Augusto Silva</code>。请参阅此SO答案,以获取执行此操作的代码。

    另请参阅2015年提出的Windows上未解决的JDK错误报告JDK-8124977 cmdline编码挑战。其中包括一些关于在Windows上使用cmd和PowerShell窗口中的java之间差异的讨论。

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

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

    这个问题似乎已经在本月晚些时候发布的Java 19中完全解决了。从下面的屏幕截图:

    >

  • 当使用JDK19时,对javac的调用将成功。

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

    我在JDK 19发行说明中找不到任何提及此修复的内容。

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

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

    如果选项< code>Beta:将Unicode UTF-8用于全球语言支持未启用,我无法重现该问题;对javac的调用在使用JDK 18和JDK 19时都能正常工作:

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

      < li >你在用Windows 11,我在用Windows 10。 < li >我的系统区域设置是英语(美国),我想您的可能不同。

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

    • 除非您由于某些特定原因启用了测试版选项,否则请考虑禁用它。
    • 如果要保持该选项启用,请考虑升级到Java19。

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

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

    8272352:当系统区域设置设置为UTF-8 #530时,Java启动器无法解析中文字符

    虽然该错误修复特别与传递给 java 的文件名有关,但我认为这可能解释了为什么 Java 19 中也解决了 OP 的 javac 问题。

  •  类似资料:
    • 我创建了一个java代码来存储上传的文本文档。然后我返回该文件中的文本。所有文本均为“僧伽罗语”。UTF-8编码文本 输出直接发送到jsp页面,在那里显示为'??????????????'。 Windows 8.1、tomcat和java版本7。我已经用僧伽罗字符测试了jsp,它们正在工作。我添加了UTF-8作为内容类型。 我试过这个,这个,还有这个。

    • 我最近尝试导入一个现有的Gradle项目,使用启动窗口中的“Open project”选项和现有的build.Gradle文件自动设置该项目。 就在我这样做之后,IntelliJ中出现了一条错误消息,说: 看起来像这样,IntelliJ抱怨我没有将play框架添加到我的PATH变量中。尽管外壳的输出告诉了某事物。其他: 我还编写了一个简单的类来显示IntelliJ使用的PATH变量: 当我运行这个

    • 问题内容: 我在Windows 2012服务器上使用PowerShell,我从System32删除了所有Java命令,重新安装了jdk,将JAVA_HOME和Path设置为指向新安装。而且我仍然收到以下错误: 问题答案: 我从System32删除了所有Java命令 这就是Windows无法找到java.exe的原因。默认的JRE安装将Java放入System32目录,而CMD和Powershell

    • 问题内容: 我正在尝试安装,但正在运行return 在使用各种软件包之前,这种情况会持续一段时间,然后再返回其他任何内容。给我: 如何安装?在github页面的自述文件中使用了(而不是)。我的Go版本是。 问题答案: 这些问题与无效有关。 我认为您已安装Go in 。 因此,将您的路径更改为的值。 看来您的工作空间(GOPATH)位于。 这可能会解决您的问题。 将此添加到bash配置文件的底部,位

    • 伙计们,我不能在命令行编译或运行我的任何程序。我在路径中设置了的位置,但这没有任何作用。还有其他的修复吗? 我的路是这样的: C:\程序文件(x86)\Java\JRE1.8.0_40\bin;C:\ProgramData\Oracle\Java\JavaPath;C:\程序文件(x86)\nVidia Corporation\PhysX\common;C:\Windows\System32;C:

    • 我安装了Java JDK,然后在高级设置中设置了系统环境的路径,但在命令提示符中仍然无法识别。。 这是截图