簡體   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