Maven UTF-8 编码问题

Akı*_*ğlu 4 java utf-8 maven

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

    String myString = "Türkçe Karakter Testi : ?ü?iöç?Ü??ÇÖ?";
    String value = new String(myString.getBytes("UTF-8"));
    System.out.println(value);
Run Code Online (Sandbox Code Playgroud)

第一个项目是在 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>
Run Code Online (Sandbox Code Playgroud)

这个项目给了我:

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

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

Kay*_*man 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);
Run Code Online (Sandbox Code Playgroud)

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

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