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"))