我是在java中做的相關測試, 首先粘貼下報錯:
讀取xml配置文件:xmls\property.xml org.dom4j.DocumentException: Error on line 1 of document : 前言中不允許有內容。 Nested exception: 前言中不允許有內容。 at org.dom4j.io.SAXReader.read(SAXReader.java:482) at org.dom4j.io.SAXReader.read(SAXReader.java:365) at com.core.util.XmlTemplateUtil.loadXmlTemplateByIO(XmlTemplateUtil.java:93) at com.game.impl.TemplateDataManager2.initFromDisk(TemplateDataManager2.java:61) at start.Main.<init>(Main.java:55) at start.Main.main(Main.java:128) Nested exception: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; 前言中不允許有內容。 at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source) at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(Unknown Source) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source) at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source) at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source) at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source) at org.dom4j.io.SAXReader.read(SAXReader.java:465) at org.dom4j.io.SAXReader.read(SAXReader.java:365) at com.core.util.XmlTemplateUtil.loadXmlTemplateByIO(XmlTemplateUtil.java:93) at com.game.impl.TemplateDataManager2.initFromDisk(TemplateDataManager2.java:61) at start.Main.<init>(Main.java:55) at start.Main.main(Main.java:128)
這個提示直白點就是說xml文件中<在你想象的文本內容>的開頭,還有別的內容. 網上有很多類似問題的解決方案也是與此相關的.但是描述並不准確. 可能他真的是在xml文件的開頭誤寫了一個什麼東西, 在他刪除之後,他的這個問題隨之解決. 於是熱心腸上網回復了遇見同樣問題的人. 但是你可能翻來覆去檢查了N次, 並沒有看到有什麼多余的字符. 可能你就轉向選擇了另外一種解決方案:更換編碼格式為ANSI.
到這裡, 引用下別人介紹過的相關知識和解決方法<原鏈接地址:https://zhidao.baidu.com/question/537175301.html?fr=iks&word=utf-8%CE%DEbom&ie=gbk>:
BOM——Byte Order Mark,就是字節序標記
在UCS 編碼中有一個叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的編碼是FEFF。而FFFE在UCS中是不存在的字符,所以不應該出現在實際傳輸中。UCS規范建議我們在傳輸字節流前,
先傳輸字符"ZERO WIDTH NO-BREAK SPACE"。這樣如果接收者收到FEFF,就表明這個字節流是Big-Endian的;如果收到FFFE,就表明這個字節流是Little-Endian的。
因此字符"ZERO WIDTH NO-BREAK SPACE"又被稱作BOM。
UTF-8不需要BOM來表明字節順序,但可以用BOM來表明編碼方式。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8編碼是EF BB BF。所以如果接收者收到以EF BB BF開頭的字節流,就知道這是UTF-8編碼了。
UTF-8編碼的文件中,BOM占三個字節。如果用記事本把一個文本文件另存為UTF-8編碼方式的話,用UE打開這個文件,切換到十六進制編輯狀態就可以看到開頭的FFFE了。這是個標識UTF-8編碼文件的好辦法,軟件通過BOM來識別這個文件是否是UTF-8編碼,很多軟件還要求讀入的文件必須帶BOM。可是,還是有很多軟件不能識別BOM。
在Firefox早期的版本裡,擴展是不能有BOM的,不過Firefox 1.5以後的版本已經開始支持BOM了。現在又發現,PHP也不支持BOM。PHP在設計時就沒有考慮BOM的問題,也就是說他不會忽略UTF-8編碼的文件開頭BOM的那三個字符。 由於必須在在Bo-Blog的wiki看到,同樣使用PHP的Bo-Blog也一樣受到BOM的困擾。其中有提到另一個麻煩:“受COOKIE送出機制的限制,在這些文件開頭已經有BOM的文件中,COOKIE無法送出(因為在COOKIE送出前PHP已經送出了文件頭),所以登入和登出功能失效。一切依賴COOKIE、SESSION實現的功能全部無效。”這個應該就是Wordpress後台出現空白頁面的原因了,因為任何一個被執行的文件包含了BOM,這三個字符都將被送出,導致依賴cookies和session的功能失效。
解決的辦法嘛,如果只包含英文字符(或者說ASCII編碼內的字符),就把文件存成ASCII碼方式吧。用UE等編輯器的話,點文件->轉換->UTF-8轉ASCII,或者在另存為裡選擇ASCII編碼。如果是DOS格式的行尾符,可以用記事本打開,點另存為,選ASCII編碼。如果包含中文字符的話,可以用UE的另存為功能,選擇“UTF-8 無 BOM”即可。
看到這裡你就明白了, 你選擇的編碼格式就是這種帶著BOM標記的編碼格式. 在很多文本編輯器裡, 另存為utf-8時,你可能沒注意到他是存的是帶BOM標記的utf-8還是不帶BOM標記的utf-8. 所以,不是一定要更改成為ANSI格式,"utf-8 無BOM"類型也是可以解決問題的.