2010-06-15 3 views
2

나는 다음과 같은 코드가 있습니다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 저장 한자를 올바르게 만들 수 있습니까?

감사합니다.

답변

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

플랫폼에서 기본 문자 인코딩이 중국어를 표시 할 수없는 경우 Java를 시작할 때 콘솔 에서 재정의해야합니다. Java의 문자 인코딩을 설정하려면 명령 행에 file.encoding 속성 을 설정하십시오 (프로그램에 System.setProperty()을 호출하면 작동하지 않음).

java -Dfile.encoding=Big5 ... 

Vista에서 콘솔 인코딩 설정 명령을 알지 못합니다. Windows XP에서는 chcp ("코드 페이지 변경") 명령이었습니다.

3

XStream FAQ에 따르면 플랫폼 기본 인코딩이 무엇이든 출력 (1)을 생성하고 XML 프롤로그없이 (2)를 생성합니다. 정말 나쁜 조합입니다.

toXml(Writer)을 사용하는 FAQ recomments. OutputStreamWriter을 사용하는 경우 생성 중에 인코딩을 지정할 수 있습니다. XStream은 프롤로그를 내 보내지 않으므로 "UTF-8"을 사용하는 것이 좋습니다. XML 스펙에 필요한 것입니다.

또는 FAQ의 다른 권장 사항 중 하나를 따르고 수동으로 XML 프롤로그를 기본 인코딩으로 스트림에 작성한다고 가정합니다. 나는 그것을 추천하지 않는다.

+0

왜 "UTF-16"인코딩을 사용하지 않아야합니까? 자바 문자열 저장소 데이터가 UTF-16이 아닌가요? –

+0

UTF-16을 사용할 수 있습니다. 중국어 텍스트의 경우 UTF-16 파일은 UTF-8 파일보다 작아야합니다. 그러나 만약 당신이 그 경로를 가면, 파일의 시작 부분에 BOM을 내 보내야하는데, 나는'OutputStreamWriter'가 자동적으로 그렇게한다고 믿지 않습니다. 인코딩에 대한 자세한 내용은 http://www.xml.com/axml/testaxml.htm을 참조하십시오. – Anon

관련 문제