xstream处理非英语字符

时间:2010-06-15 18:18:43

标签: java

我有以下代码:

/*
 * 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正确保存汉字?

感谢。

3 个答案:

答案 0 :(得分:3)

根据XStream FAQ,它使用您的平台默认编码生成输出(1),以及(2)没有XML序言。这是一个非常糟糕的组合。

常见问题解答使用toXml(Writer)进行推荐。如果使用OutputStreamWriter,则可以在构造期间指定编码。由于XStream不会发出序幕,我建议使用“UTF-8”,因为这是XML规范所要求的。

或者,我想您可以按照常见问题解答中的其他建议之一进行操作,并使用默认编码手动将XML序言写入流中。我不推荐。

答案 1 :(得分:2)

XStream xStream = new XStream(new DomDriver("UTF-8")); 

答案 2 :(得分:1)

如果平台上的默认字符编码无法显示中文,则需要在启动Java时在控制台中覆盖它。要设置Java的字符编码,请在命令行上设置file.encoding属性(如果在程序中调用System.setProperty(),则无效。)

java -Dfile.encoding=Big5 ...

我不知道在Vista中设置控制台编码的命令。在Windows XP中,它是chcp(“更改代码页”)命令。