Maven UTF-8编码问题

4
当我在两个不同的项目中运行以下代码时,我得到不同的输出。
    String myString = "Türkçe Karakter Testi : ğüşiöçĞÜİŞÇÖĞ";
    String value = new String(myString.getBytes("UTF-8"));
    System.out.println(value);

第一个项目是在Netbeans 8.2中创建的非Maven Java应用程序。它给了我以下预期结果:

"Türkçe Karakter Testi : ğüşiöçĞÜİŞÇÖĞ"

第二个项目是使用相同方式创建的Maven Java应用程序项目,并附有以下pom.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.mycompany</groupId>
    <artifactId>mavenproject1</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
</project>

这个项目给了我:

"土耳其字符测试:ğüşiöçĞÜİŞÇÖ"

我用notepad++检查了这两个文件,它们都是以UTF-8编码的。


类似问题:Java编码与Eclipse和Maven - user8097737
@devpuh,尽管这个问题实际上与Maven无关。 - Kayaman
是的,但我在两个项目中使用相同的代码却得到了不同的结果。我无法弄清原因。 - Akın Tekeoğlu
2个回答

5

您的new String()构造函数中缺少编码信息,因此它使用您平台的默认编码,该编码不是UTF-8(看起来像ISO-8859-1的某个变种)。

如果您使用以下代码(虽然没有太多意义,但显示了默认编码混淆的情况),则将在所有地方正确打印。

String myString = "Türkçe Karakter Testi : ğüşiöçĞÜİŞÇÖĞ";
String value = new String(myString.getBytes("UTF-8"), "UTF-8");
System.out.println(value);

这里的教训是什么?在处理 byte/character 转换时,始终要指定要使用的编码! 这包括诸如 String.getBytes()new String()new InputStreamReader() 等方法。

这只是字符编码可能会让你犯错的众多方式之一。虽然它似乎是一个简单的问题,但它经常会让毫无准备的开发人员措手不及。


1

我也经常面临着同样的问题。


配置Maven字符编码

问题

  • 在IDE(Idea/Eclipse)中运行代码。一切正常。输出具有正确的编码,无论是在控制台还是在输出文件中。

  • 在构建Maven之后运行应用程序。当我尝试运行使用Maven构建的App(jar)时mvn clean install, 我会在输出中看到与编码不符的值。 在我的应用程序中生成的控制台输出文件中,我看到了不正确和意外的符号。

  • 警告您的控制台。此警告意味着您尚未为项目/环境设置任何字符编码。 让我们解决这个问题。您可以考虑几个选项。

[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!

配置Maven字符编码

1. 属性

设置Maven字符编码最常见的方式是使用属性。大多数插件都支持这些属性。添加这些属性非常容易,只需将它们添加为项目元素的子元素即可。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                             http://maven.apache.org/xsd/maven-4.0.0.xsd">
    [...]
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>
    [...]
</project>

2. Maven资源插件

您也可以使用Maven资源插件指定Maven字符编码。

唯一的缺点是您必须将此插件包含到您的Maven pom.xml文件中。

只需添加此插件 - 它总是帮助我))

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                             http://maven.apache.org/xsd/maven-4.0.0.xsd">
    [...]
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <configuration>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>
    [...]
</project>

3. 命令行

如果您无法更改maven项目的源代码,或者需要在构建服务器(如Jenkins、Hudson或Bamboo)上指定maven字符编码,您也可以通过命令行添加编码。

mvn -Dproject.build.sourceEncoding=UTF-8 -Dproject.reporting.outputEncoding=UTF-8 clean deploy

4. Maven选项

如果您为个人利益而进行许多小项目,您还可以在MAVEN_OPTS中全局设置此属性。唯一的缺点是,如果您与另一个开发人员共享代码库,则该开发人员还必须添加这些MAVEN_OPTS。这就是为什么我不建议这样做的原因。

set MAVEN_OPTS= -Dfile.encoding="UTF-8"

@See 如何配置Maven字符编码


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