Xerces Sax2解析器编码问题

时间:2011-07-01 09:47:20

标签: java xml saxparser

我有一个Sax解析器类,用于Swing应用程序和部署到GlassFish的Web项目。

该类解析xml文件。它在Netbeans IDE Swing应用程序(在IDE中)和Web项目中运行良好。

但是当我将swing应用程序清理并构建为一个.jar时,它无法识别xml文件中的ī,ķ,ļ,ā等符号。

如果我通过cmd编译并运行它,则会出现同样的问题。

在Web项目中存在同样的问题 - 使用Glassfish配置进行排序。

问题是如何在swing app中解决这个问题?

这是代码的和平:

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()方法没有帮助。

2 个答案:

答案 0 :(得分: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。根据{{​​3}}的javadoc,它始终在“默认字符集”中打开文件,这就是您的解决方案有效的原因,因为您正在更改默认字符集。您还可以明确说明要在哪个字符集中打开文件,但为此,您需要使用InputStreamReader和FileInputStream的组合。

答案 1 :(得分:0)

回答我自己的问题。

问题出在JVM设置上。

我在Windows系统变量中添加了一个新变量:

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

完美无缺。