XStream的处理非英文字符
问题描述:
我有以下代码:XStream的处理非英文字符
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package helloworld;
import com.thoughtworks.xstream.XStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import javax.swing.JOptionPane;
/**
*
* @author yccheok
*/
public class Test {
@SuppressWarnings("unchecked")
public static <A> A fromXML(Class c, File file) {
XStream xStream = new XStream();
InputStream inputStream = null;
try {
inputStream = new java.io.FileInputStream(file);
Object object = xStream.fromXML(inputStream);
if (c.isInstance(object)) {
return (A)object;
}
}
catch (Exception exp) {
exp.printStackTrace();
}
finally {
if (inputStream != null) {
try {
inputStream.close();
inputStream = null;
}
catch (java.io.IOException exp) {
exp.printStackTrace();
return null;
}
}
}
return null;
}
@SuppressWarnings("unchecked")
public static <A> A fromXML(Class c, String filePath) {
return (A)fromXML(c, new File(filePath));
}
public static boolean toXML(Object object, File file) {
XStream xStream = new XStream();
OutputStream outputStream = null;
try {
outputStream = new FileOutputStream(file);
xStream.toXML(object, outputStream);
}
catch (Exception exp) {
exp.printStackTrace();
return false;
}
finally {
if (outputStream != null) {
try {
outputStream.close();
outputStream = null;
}
catch (java.io.IOException exp) {
exp.printStackTrace();
return false;
}
}
}
return true;
}
public static boolean toXML(Object object, String filePath) {
return toXML(object, new File(filePath));
}
public static void main(String args[]) {
String s = "\u6210\u4EA4\u91CF";
// print ???
System.out.println(s);
// fine! show 成交量
JOptionPane.showMessageDialog(null, s);
toXML(s, "C:\\A.XML");
String o = fromXML(String.class, "C:\\A.XML");
// show ???
JOptionPane.showMessageDialog(null, o);
}
}
我通过运行命令提示符下面的代码在Windows Vista中。
1)我可以知道为什么System.out.println无法在控制台中打印出中文字符吗?
2)我打开了xstream文件。保存的值为
<string>???</string>
如何让xstream正确保存中文字符?
谢谢。
答
XStream xStream = new XStream(new DomDriver("UTF-8"));
答
如果平台上的默认字符编码不能显示中文,则需要在启动Java时在控制台和中覆盖它。要设置Java的字符编码,请在命令行上设置file.encoding
属性(如果您在程序中调用System.setProperty()
,它将不起作用)。
java -Dfile.encoding=Big5 ...
我不知道在Vista中设置控制台编码的命令。在Windows XP中,它是chcp
(“更改代码页”)命令。
答
根据XStream FAQ,它生成输出(1),无论您的平台默认编码是什么,(2)没有XML序言。这是一个非常糟糕的组合。
该FAQ的推荐使用toXml(Writer)
。如果您使用OutputStreamWriter
,则可以在构建过程中指定编码。由于XStream不会发布序言,因此我推荐使用“UTF-8”,因为这是XML规范所要求的。
另外,我想你可以按照常见问题中的其他建议之一,并使用默认编码手动将XML序言写入流中。我不推荐。
为什么我不应该使用“UTF-16”编码? Java String是否将数据存储在UTF-16中? – 2010-06-15 18:33:38
你可以使用UTF-16。而对于中文文本,UTF-16文件应该小于UTF-8文件。然而,如果你走这条路线,你需要在文件开始时发出一个BOM,并且我不相信'OutputStreamWriter'会自动执行。有关编码的更多信息,请参见http://www.xml.com/axml/testaxml.htm。 – Anon 2010-06-15 18:37:55