有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Maven UTF8编码问题

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

    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:ÄŸ1956;Ÿiޤ§?1959;?19525;–”

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


共 (2) 个答案

  1. # 1 楼答案

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

    这只是字符编码在背后咬你一口的众多方式之一。这似乎是一个简单的问题,但它总是吸引着毫无戒心的开发人员

  2. # 2 楼答案

    我也经常遇到同样的问题


    配置Maven字符编码

    问题

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

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

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

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

    配置Maven字符编码

    一,。性质

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

    <?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>
    

    二,。Maven资源插件

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

    唯一的缺点是您必须将此插件包含到Mavenpom.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>
    

    三,。命令行

    如果无法更改maven项目的源代码,或者需要在Jenkins、Hudson或Bambor等内置服务器上指定maven字符编码,也可以通过命令行添加编码

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

    四,。Maven选项

    如果你为了个人利益做了很多小项目,你也可以在MAVEN_OPTS中全局设置这个属性。唯一的缺点是,如果您与其他开发人员共享代码库,那么开发人员还必须添加这些MAVEN_OPTS。这就是为什么我不推荐它

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

    @见How to Configure Maven Character Encoding