SAXParseException: The encoding "GBK" is not supported --- 解决办法与分析

原创 2015年07月08日 22:57:34

背景:

解析本地的一个XML文件,文件编码GBK,XML文件头:<?xml version="1.0" encoding="GBK" ?> 

可能的代码:

    1.读取XML文件,获得document对象            
                   SAXReader reader = new SAXReader();               
                   Document   document = reader.read(new File("csdn.xml"));
    2.解析XML形式的文本,得到document对象.
                   String text = "<csdn></csdn>";             
                   Document document = DocumentHelper.parseText(text);
    3.主动创建document对象.
                  Document document = DocumentHelper.createDocument();              //创建根节点
                  Element root = document.addElement("csdn");


运行时抛出异常

SAXParseException: The encoding "GBK" is not supported。

按照网络上说的方法:检查xml的格式,utf-8  去BOM 诸如此类都没有办法解决。


后面发现同样的代码可以在另外正常运行,开始比较差异。

原来是jar包惹的祸:

dom4j-1.6.1.jar 依赖于xerces  对xml解析的实现。

而一般使用的xerces-2.6.2.jar 并不支持GBK的编码格式。

为什么有些情况下又没问题呢?


关键jdk的版本,jdk6后的rt包实现了xml解析,支持gbk,故2种解决方案。

1. 升级xerces.jar

2. 升级jdk 或者(关掉1.4兼容API)


=====原因再分析==========

http://dom4j.sourceforge.net/dom4j-1.6.1/apidocs/org/dom4j/io/SAXReader.html

The actual SAX parser that is used by this class is configurable so you can use your favourite SAX parser if you wish. DOM4J comes configured with its own SAX parser so you do not need to worry about configuring the SAX parser.

To explicitly configure the SAX parser that is used via Java code you can use a constructor or use the setXMLReader(XMLReader)or setXMLReaderClassName(String) methods.

If the parser is not specified explicitly then the standard SAX policy of using the org.xml.sax.driver system property is used to determine the implementation class of XMLReader.

If the org.xml.sax.driver system property is not defined then JAXP is used via reflection (so that DOM4J is not explicitly dependent on the JAXP classes) to load the JAXP configured SAXParser. If there is any error creating a JAXP SAXParser an informational message is output and then the default (Aelfred) SAX parser is used instead.

-------------call trace---------

org.dom4j.io.SAXReader.read(XXXX)

org.dom4j.io.SAXReader.read(InputSource in)

org.dom4j.io.SAXReader.getXMLReader(SAXReader.java:715)

org.dom4j.io.SAXReader.createXMLReader(SAXReader.java:894)

org.dom4j.io.SAXHelper.createXMLReader(SAXHelper.java:83)

org.xml.sax.helpers.XMLReaderFactory.createXMLReader()


先查找 property的值

private static final String property = "org.xml.sax.driver";
public static XMLReader createXMLReader ()
	throws SAXException
    {
	String		className = null;
	ClassLoader	loader = NewInstance.getClassLoader ();
	
	// 1. try the JVM-instance-wide system property
	try { className = System.getProperty (property); }
	catch (RuntimeException e) { /* normally fails for applets */ }

	// 2. if that fails, try META-INF/services/
	if (className == null) {
	    try {
		String		service = "META-INF/services/" + property;
		InputStream	in;
		BufferedReader	reader;

		if (loader == null)
		    in = ClassLoader.getSystemResourceAsStream (service);
		else
		    in = loader.getResourceAsStream (service);

		if (in != null) {
		    reader = new BufferedReader (
			    new InputStreamReader (in, "UTF8"));
		    className = reader.readLine ();
		    in.close ();
		}
	    } catch (Exception e) {
	    }
	}
      // 3. Distro-specific fallback
       if (className == null) {
      // BEGIN DISTRIBUTION-SPECIFIC

        // EXAMPLE:
        // className = "com.example.sax.XmlReader";
        // or a $JAVA_HOME/jre/lib/*properties setting...
            className = "com.sun.org.apache.xerces.internal.parsers.SAXParser";

      // END DISTRIBUTION-SPECIFIC
     }
   // do we know the XMLReader implementation class yet?
    if (className != null)
        return loadClass (loader, className);

    // 4. panic -- adapt any SAX1 parser
    try {
        return new ParserAdapter (ParserFactory.makeParser ());
    } catch (Exception e) {
        throw new SAXException ("Can't create default XMLReader; "
            + "is system property org.xml.sax.driver set?");
    }
  }








版权声明:本文为博主原创文章,转载请声明链接。

Unity 各种小问题

1. 淡入淡出的效果,可以调材质球的阿尔法
  • m_crab
  • m_crab
  • 2014年08月23日 16:11
  • 2281

使用JDBC连接DB2时encoding not supported异常的解决方法

近日,使用JDBC连接另外机器上的DB2 v9.5时发生异常:com.ibm.db2.jcc.b.DisconnectException: encoding not supported!!DB2服务器...
  • cyq1984
  • cyq1984
  • 2010年12月22日 16:37
  • 8162

Unity引用dll后发布报错"Encoding name 'IBM437' not supported"

在Unity平台使用C#开发时,引用了dll并发布到pc平台,发布时勾选了Development Build和Development后运行,报出如下错误 经过查找资料之后,找到如下解决方法: 从U...
  • wanyu_0002
  • wanyu_0002
  • 2017年03月24日 20:58
  • 1006

Error parsing XML. Cause: org.xml.sax.SAXParseException: Invalid encoding name "GBK"

首先说明一下自己的开发环境,mvn2.2.1、eclipse3.6 最近在写dao层单元测试时报如下错误: java.lang.IllegalStateException: Failed to l...
  • yizhizouxiaqu
  • yizhizouxiaqu
  • 2011年09月06日 20:49
  • 3927

Charset from HTTP Content-Type US-ASCII does not match encoding from XML declaration GBK

nusoap是PHP环境中的开源soap工具,算是用得比较多的一个工具了。     在utf-8环境中,nusoap可以工作得很好。但是当用于中文环境中时,nusoap经常会出现一些让人不得其解...
  • u010175124
  • u010175124
  • 2014年05月22日 11:02
  • 1217

Character encoding "GB2321" is not support by this platform

第一点:是“gb2312” 第二点:你可以到 右键点击你的工程名-properties(alt+enter键)设置text file encoding,简单又不容易出错!...
  • debugm
  • debugm
  • 2011年12月05日 21:24
  • 2378

又见中文乱码 -Dfile.encoding=GBK

在setDomianEnv.sh中添加环境变量-Dfile.encoding=GBK    问题解决。其原因在于String.getBytes()时实际调用StringCoding.encode(va...
  • zhouxianli
  • zhouxianli
  • 2008年06月19日 17:34
  • 9000

Python文件编码---gbk?OR utf8?

Python文件编码---gbk?OR utf8? windows文件名的编码是cp936的,你在使用中文文件名的时候转下码就行了。 比如你python文件编码是utf8 # -*- cod...
  • jiangxinyu
  • jiangxinyu
  • 2013年04月02日 22:15
  • 4975

解决javadoc生成文档-unmappable character for encoding GBK

前言        今天在使用javadoc生成文档的时候总是会报这样的错误,想着是不是文件的编码出问题了。查了整个项目乃至单个文件的编码都是UTF-8啊。然而,问题貌似不出在这里!问题       ...
  • wangmeng951011
  • wangmeng951011
  • 2017年03月08日 13:24
  • 222

ibatis中配置文件载入错误org.xml.sax.SAXParseException: The string "--" is not permitted

在ibatis加载配置文件的过程中,出现解析错误org.xml.sax.SAXParseException: The string "--" is not permitted 这个有两个情况...
  • huoyin
  • huoyin
  • 2014年02月20日 23:58
  • 1540
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SAXParseException: The encoding "GBK" is not supported --- 解决办法与分析
举报原因:
原因补充:

(最多只允许输入30个字)