我在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 ...
编译来检查字符集问题。