2010-06-15 4 views
2

Je le code suivant:xstream poignées caractère non anglais

/* 
* 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); 
    } 
} 

je lance le code suivant dans l'invite de commande dans Windows Vista.

1) Puis-je savoir pourquoi System.out.println ne peut pas imprimer de caractères chinois dans la console?

2) J'ouvre le fichier xstream. La valeur enregistrée est

<string>???</string> 

Comment puis-je faire en sorte que xstream enregistre correctement les caractères chinois?

Merci.

Répondre

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

Si le codage de caractères par défaut sur la plate-forme n'est pas capable d'afficher le chinois, vous devez le remplacer dans la console et lors du lancement de Java. Pour définir le codage de caractères Java, définissez la propriété file.encodingsur la ligne de commande (cela ne fonctionnera pas si vous appelez System.setProperty() dans votre programme). Je ne connais pas la commande pour définir le codage de la console dans Vista. Sous Windows XP, c'était la commande chcp ("change code page").

3

Selon le XStream FAQ, il génère la sortie (1) avec le codage par défaut de votre plateforme, et (2) sans prologue XML. Ce qui est une très mauvaise combinaison.

La FAQ recommence en utilisant toXml(Writer). Si vous utilisez un OutputStreamWriter, vous pouvez spécifier l'encodage pendant la construction. Comme XStream n'émet pas de prologue, je recommande d'utiliser "UTF-8", car c'est ce que requiert la spécification XML. Alternativement, je suppose que vous pourriez suivre l'une des autres recommandations de la FAQ, et écrire manuellement un prologue XML dans le flux avec votre encodage par défaut. Je ne le recommande pas.

+0

Pourquoi ne pas utiliser le codage "UTF-16"? Les données du magasin Java String ne sont-elles pas en UTF-16? –

+0

Vous pouvez utiliser UTF-16. Et pour le texte chinois, un fichier UTF-16 devrait être plus petit qu'un fichier UTF-8. Cependant, si vous suivez cette route, vous devez émettre une nomenclature au début du fichier, et je ne crois pas que 'OutputStreamWriter' le fasse automatiquement. Voir http://www.xml.com/axml/testaxml.htm pour plus d'informations sur les encodages. – Anon

Questions connexes