不同 IDE 中 Junit 测试的不同结果


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 中运行它时,输出是这样的:© .

如果我将代码放入公共静态 void main 并运行它 - 一切都很好。

如果我将FileReader更改为FileInputStream - 一切都很好。

如果我将文件阅读器更改为StringReader("<root>©</root>") - 一切都很好。

能是什么?

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

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

此类的构造函数假定默认字符 编码和默认字节缓冲区大小是合适的。要指定 这些值自己,在 文件输入流。

换句话说:

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

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

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

最新更新