解析XML文件时的乱码问题
程序员文章站
2022-07-08 22:52:31
...
使用的是SAX解析器:
1. 输入流是字符流,经过InputSource封装后,解析器直接读取该流,忽略其中的任何字符编码声明:
2. 输入流是字节流:
a. 字节流不包含编码信息,需要调用InputSource的setEncoding(String encoding)方法来指定编码。
b. 如果没有传入编码参数,解析器会根据XML文件中声明的编码来解析
c. 如果XML文件中也没有编码声明,则根据XML规范中的算法自动探测字符编码,这样很有可能产生乱码情况。
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规范中的算法自动探测字符编码,这样很有可能产生乱码情况。
上一篇: Lucene入门学习二
下一篇: Pentaho CDE 乱码问题解决