2011-07-01 37 views
0

我有一個Sax解析器類,用於Swing應用程序和部署到GlassFish的Web項目中。Xerces Sax2解析器編碼問題

該類解析xml文件。它在NetBeans IDE Swing應用程序(在IDE中)和Web項目中完美工作。

但是,當我將Clean應用程序清理並構建爲一個.jar文件時,它不會再從xml文件中識別符號ī,ķ,ļ,ā。

如果我通過cmd編譯並運行它,會發生同樣的問題。

Web項目中存在同樣的問題 - 使用Glassfish配置進行排序。

問題是如何在swing應用程序中解決這個問題?

這裏是一個代碼和平:

public void parseDocument(String filePath) { 

    try { 
     XMLReader xr = XMLReaderFactory.createXMLReader(); 
     xr.setContentHandler(this); 
        InputSource is = new InputSource(new FileReader(filePath)); 
        is.setEncoding("UTF-8"); 
     xr.parse(is); 

    }catch(SAXException se) { 
     se.printStackTrace(); 
    }catch (IOException ie) { 
     ie.printStackTrace(); 
    } 
} 

從setEncoding()方法沒有任何幫助。

+0

在命令行中,您可以使用Netbean用來運行您的jar的JVM嗎?我有經驗問題,雖然一個JVM運行我的代碼很好,但另一個不是由於底層的XMLReader實現。和平! – Alvin

+0

謝謝阿爾文,你讓我在正確的方向尋找解決方案。 –

+0

@ sergej.art如果你喜歡這個答案,不要忘記加入它,甚至可能接受它。 –

回答

0

回答我自己的問題。

問題出在JVM設置上。

我添加在Windows系統變量的新變量:

Variable name:JAVA_TOOL_OPTIONS 
Variable value: -Dfile.encoding=UTF8 

完美的作品。

1

您已經回答了您的問題,但是另一種可以處理此問題的方法是在打開文件時明確設置轉換。

public void parseDocument(String filePath) { 
    try { 
    XMLReader xr = XMLReaderFactory.createXMLReader(); 
    xr.setContentHandler(this); 
    Reader reader = new InputStreamReader(new FileInputStream(filePath); 
    InputSource is = new InputSource(reader, "UTF-8"); 
    is.setEncoding("UTF-8"); 
    xr.parse(is); 
    }catch(SAXException se) { 
    se.printStackTrace(); 
    }catch (IOException ie) { 
    ie.printStackTrace(); 
    } 
} 

這和你在問題中的解決方案的最大區別在於我們在FileInputStream的頂部使用了InputStreamReader。根據FileReader的javadoc,它總是以「默認字符集」打開文件,這就是您的解決方案工作的原因,因爲您正在更改默認字符集。您也可以明確地說出要打開哪個字符集,但要做到這一點,您需要使用InputStreamReader和FileInputStream的組合。

+0

工作,謝謝!將使用您的建議。 –

+0

@ sergej.art如果你喜歡這個答案,不要忘記加入它,甚至可能接受它。 –