我有一个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()方法没有帮助。
答案 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
完美无缺。