解析XML文件时的乱码问题

使用的是SAX解析器:
    DocumentBuilderFactory doDocumentBuilder = DocumentBuilderFactory.newInstance();
    DocumentBuilder docBuilder = doDocumentBuilder.newDocumentBuilder();


1. 输入流是字符流,经过InputSource封装后,解析器直接读取该流,忽略其中的任何字符编码声明:
	BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("dialect.xml"), "WINDOWS-1252")); // 实例化InputStreamReader时,已指定字符编码
	InputSource is = new InputSource(reader);
	Document doc = docBuilder.parse(is);
	doc.getDocumentElement().normalize();


2. 输入流是字节流

a. 字节流不包含编码信息,需要调用InputSource的setEncoding(String encoding)方法来指定编码。
	BufferedInputStream bis = new BufferedInputStream(new FileInputStream("dialect.xml"));
	InputSource is = new InputSource(bis);
	is.setEncoding("WINDOWS-1252");
	Document doc = docBuilder.parse(is);


b. 如果没有传入编码参数,解析器会根据XML文件中声明的编码来解析

<?xml version="1.0" encoding="WINDOWS-1252"?>
<dialects>
</dialects>


c. 如果XML文件中也没有编码声明,则根据XML规范中的算法自动探测字符编码,这样很有可能产生乱码情况。

你可能感兴趣的:(java,xml,encoding)