Intellij 编译错误:"É 符号的"非法字符"



我在Java中有一个Enum类,包含字母É:

public enum Types {
RÉSUMÉ
}

当试图构建项目时,IntelliJ抱怨É标志:

error: illegal character: 'u2030'
RÉSUMÉ
^

我用的是Windows 10。

在过去,同样的项目在我的计算机上编译和运行没有任何问题。因此,似乎是设置中的某些更改导致了这个问题。

不能用E代替É

你知道怎么解决这个问题吗?

编辑

  • 用于运行JDK 11的代码,已升级到Java 17。也许这和它有关。试图降级项目的JDK (Settings ->构建→Gradle→回到JDK 11)没有帮助

字符集&Java源代码文件编码

如前所述,您的源代码文件可能是用UTF-8以外的字符编码编写的。现在你的编译器期望UTF-8,并读取你的源代码。

出现这个问题可能有以下两个原因:

  • 您的编译器或IDE设置已更改
  • 👉您将JDK从较早版本的Java更改为Java 18或更高版本。
    • Java的早期版本默认使用主机操作系统平台的默认字符集编写源代码。
    • Java 18+在大多数情况下默认使用UTF-8。

这个字符编码误读假设的主要线索是代码点U+2030是而不是拉丁大写字母E WITH ACUTE字符,也不是大写字母E后跟重音的组合。不,代码点2030的十六进制(8,240的十进制)是PER MILLE SIGN:.

Java 18+默认为UTF-8

参见JEP 400: UTF-8 by Default。引用:

如果源文件以非utf -8编码保存并使用较早的JDK编译,那么在JDK 18或更高版本上重新编译可能会导致问题。例如,如果一个非utf -8源文件有包含非ascii字符的字符串字面值,那么这些字面值可能会被JDK 18或更高版本的javac错误解释,除非使用-encoding。

您可以很容易地验证这个新的默认值是否是问题的根源。👉返回到您的旧项目,并指定用于编译的UTF-8再次引用JEP:

在UTF-8为默认字符集的JDK上编译之前,强烈建议开发人员通过在当前JDK(8-17)上使用javac -encoding UTF-8 ...编译来检查字符集问题。