繁体   English   中英

Maven UTF-8 编码问题

[英]Maven UTF-8 encoding issue

当我用两个不同的项目运行下面的代码时,我得到不同的输出。

    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>

这个项目给了我:

"Türkçe Karakter Testi : ğüşiöçÄ?ÜİÅ?ÇÖÄ?”

我用记事本++检查了两个文件,它们都用UTF-8编码

您缺少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()

这只是字符编码在背后咬你的众多方式之一。 这似乎是一个简单的问题,但它一直让毫无戒心的开发人员陷入困境。

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


配置 Maven 字符编码

问题

  • 在 IDE (idea/eclipse) 中运行我的代码 都正确。 输出具有正确的编码并且在控制台和输出文件中。

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

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

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

配置 Maven 字符编码

1. 属性

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

<?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 字符编码

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM