Junit Test在不同IDE下的不同结果

Different results of Junit Test in different IDEs

import org.jdom2.Document;
import org.jdom2.input.SAXBuilder;
import java.io.FileReader;

public class Test1 {

    @org.junit.Test
    public void main() throws Exception {
        SAXBuilder sax = new SAXBuilder();
        Document doc = sax.build(new FileReader("resources/file.xml"));
        System.out.println(doc.getRootElement().getText());
    }
}

file.xml 包含:<root>©</root> 编码为 UTF-8。

使用的库 jdom2-2.06、hamcrest-core-1.3、junit-4.11。

当我 运行 在 IntelliJ 中输出是这样的:©.

当我 运行 在 NetBeans 中输出是这样的:©.

如果我将代码放入 public static void main 和 运行 它 - 一切正常。

如果我将 FileReader 更改为 FileInputStream - 一切正常。

如果我将 FileReader 更改为 StringReader("<root>©</root>") - 一切正常。

它可以是什么?

您在读取文件时没有指定字符集,因此它使用 JVM 默认值,afaik 运行 来自 IntelliJ 通常默认为 UTF-8,而 Eclipse(至少在 Windows ) 默认为默认的非 unicode 字符集(例如西欧的 Cp1252)。

您需要明确说明,如 FileReader 的文档中所述:

The constructors of this class assume that the default character encoding and the default byte-buffer size are appropriate. To specify these values yourself, construct an InputStreamReader on a FileInputStream.

换句话说:

new InputStreamReader(new FileInputStream("resources/file.xml"), StandardCharsets.UTF_8)

或者,让 SAXBuilder 为您处理,然后给它一个 InputStream。我相信 - 但我不是 100% 肯定 - 这将确定 XML 声明设置的字符:

sax.build(new FileInputStream("resources/file.xml"))