使用 Microsoft OpenJDK 升级到 Java 17 后出现的 Java 编码问题

3

我升级了Java 17,使用了Microsoft OpenJDK,现在所有使用非ASCII字符的测试都因为编码问题而失败。

例如,我的一个测试使用以下Unicode字符(例如U+2660到U+2663):

entityManager.persist(
    new Suit()
    .setName("Club")
    .setSymbol("♣")
);

entityManager.persist(
    new Suit()
    .setName("Diamond")
    .setSymbol("♦")
);

entityManager.persist(
    new Suit()
    .setName("Heart")
    .setSymbol("♥")
);

entityManager.persist(
    new Suit()
    .setName("Spade")
    .setSymbol("♠")
);

如何修复?


在源代码中也可以使用\u2660等来避免这些编码问题。 - Rob Audenaerde
1个回答

5

在使用由Microsoft构建的OpenJDK升级到Java 17版本时,我也遇到了问题,因为Java源文件现在使用默认的Windows编码而不是UTF-8进行编码。

要解决这个问题,请将file.encoding属性设置为UTF-8

最简单的方法是设置MAVEN_OPTS环境变量:

MAVEN_OPTS=-Dfile.encoding=UTF-8

另一个选项是将其传递给Maven Surefire插件:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>${maven-surefire-plugin.version}</version>
    <configuration>
        <argLine>-Dfile.encoding=UTF-8</argLine>
    </configuration>
</plugin>

如果您想启动Java程序,则需要传递-Dfile.encoding=UTF8属性。


2
Java 18将更改为在各个平台上使用默认字符编码UTF-8。请参阅JEP 400: UTF-8 by Default。该JEP指出,这种更改可能会在源代码文件保存在非UTF-8编码的情况下引起问题。 - Basil Bourque
我知道,但Java 18不是LTS版本,而且这个JEP 400的改变将从Java 21开始广泛采用,该版本预计在2023年发布。 - Vlad Mihalcea

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接