天天看點

invalid byte 1 of 1-byte UTF-8 sequence

在用SAX解析XML文檔的時候,在XML檔案中如果有中文的話就會抛出“invalid byte 1 of 1-byte UTF-8 sequence”異常,調試是總是找不到問題所在,于是求救于網絡,終于找到問題所在,成功解決了問題,在此謝謝強大的網絡資源。

   XML内容實際是以UTF-8編碼的,是以造成了包括中文字元的XML檔案無法正常閱讀,将編碼格式改成“GB2312”後就可以正常解析了。<?xml   version="1.0"   encoding="GB2312"?>

自己的總結:

1、“org.dom4j.DocumentException: Invalid byte 1 of 1-byte UTF-8 sequence.”異常分析和解決:

分析:

該異常由下面的reader.read(file);語句抛出:

SAXReader reader = new SAXReader();

Document doc = reader.read(file);

産生這個異常的原因是:

所讀的xml檔案實際是GBK或者其他編碼的,而xml内容中卻用<?xml version="1.0" encoding="utf-8"?>指定編碼為utf-8,是以就報異常了!

注釋:參考網上的《Java/J2EE中文問題終極解決之道》一文,編碼問題原因應該是:作業系統編碼為GBK,而xml指定為utf-8,SAXReader使用系統的預設編碼GBK,是以存在需要轉換編碼的問題,也就自然會出現亂碼了!解決:讓檔案編碼和java 操作該檔案的接口的編碼一緻;

解決:

情況一:該xml檔案由dom4j生成;

解決方法:用 org.dom4j.io.XMLWriter xmlWriter = new org.dom4j.io.XMLWriter(

                    new FileOutputStream(fileName));

代替

xmlWriter = new XMLWriter(new FileWriter(fileName));

,指定編碼為utf-8生成xml檔案;

詳細參考資料1:

Dom4j 編碼問題徹底解決 作者:lonsen

http://www.5inet.net/Develop/Java/036579,Dom4j_BianMaWenDiCheDeJieJue.aspx

情況二:解析從jsp頁面中讀取到的使用者輸入的xml描述内容時,reader.read()抛出異常;

解決方法:

調用read前先把xml内容轉為utf-8編碼:(使用支援編碼格式的函數)

public void validate(FacesContext context, UIComponent component, Object obj)

     throws ValidatorException {

            String xmldescription = (String) obj;

     byte[] bytes =xmldescription.getBytes();

            RelationXmlParser.isXmlOK("E://jiangcm//templateXMLSchema.xsd",bytes); 

     ……

    }

public static boolean isXmlOK(String xsdFile, byte[] tagetXml) throws SAXException,                  IOException, DocumentException

{

   SAXReader reader = new SAXReader();

                ……

   InputStream in = new ByteArrayInputStream(tagetXml);

   InputStreamReader utf8In=new InputStreamReader(in,"utf-8");

                ……

        }

自己的解決:String.getBytes("utf-8")

繼續閱讀