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序言写入流中。我不推荐。

+0

为什么我不应该使用“UTF-16”编码? Java String是否将数据存储在UTF-16中? – 2010-06-15 18:33:38

+0

你可以使用UTF-16。而对于中文文本,UTF-16文件应该小于UTF-8文件。然而,如果你走这条路线,你需要在文件开始时发出一个BOM,并且我不相信'OutputStreamWriter'会自动执行。有关编码的更多信息,请参见http://www.xml.com/axml/testaxml.htm。 – Anon 2010-06-15 18:37:55