2012-08-31 2 views
2

오늘 나는 매우 흥미로운 문제에 직면했다. xml 파일을 다시 쓰려고 할 때.UTF-8 쓰기 XML 성공

나는 이것을 수행하는 3 가지 방법이 있습니다. 가장 좋은 방법과 문제의 이유를 알고 싶습니다. 이 경우

File file = new File(REAL_XML_PATH); 
     try { 
     FileWriter fileWriter = new FileWriter(file); 
     XMLOutputter xmlOutput = new XMLOutputter(); 

    xmlOutput.output(document, System.out); 
    xmlOutput.output(document, fileWriter); 

    fileWriter.close(); 
    } catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 

I. 나는 내 응용 프로그램에 큰 문제가있다. 제 자신의 언어로 파일을 작성한 후에는 아무 것도 읽을 수 없습니다. 인코딩 파일이 ANSI javax.servlet.ServletException: javax.servlet.jsp.JspException: Invalid argument looking up property: "document.rootElement.children[0].children"

II에서 변경되었습니다.

File file = new File(REAL_XML_PATH); 
     XMLOutputter output=new XMLOutputter(); 
     try { 
      output.output(document, new FileOutputStream(file)); 
     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

이 경우에는 문제가 없습니다. 인코딩은 변경되지 않았습니다. 읽고 쓰는 데 문제 없습니다.

그리고이 문서 http://tripoverit.blogspot.com/2007/04/javas-utf-8-and-unicode-writing-is.html

는 내가 가장 좋은 방법 및 문제의 이유를 알고 싶어요.

답변

4

음,이 문제처럼 보이는 : 항상 거의 당신이 원하는 없습니다 플랫폼의 디폴트 인코딩을 사용합니다

FileWriter fileWriter = new FileWriter(file); 

. 기본 인코딩이 ISO-8859-1이라고 가정합니다. 문서가 UTF-8로 인코딩되도록 선언되었지만 사실을 ISO-8859-1로 모두 쓰면 비 ASCII 문자가 있으면 파일이 유효하지 않게됩니다. 유효한 UTF-8이 아닌 ISO-8859-1 싱글 바이트 표현을 사용하십시오.

실제로는 Writer이 아닌 XMLOutputter으로 스트림을 제공합니다. 그런 식으로 파일에서 선언 한 인코딩과 작성자가 사용하는 인코딩간에 충돌 할 여지가 없습니다. 코드를 다음으로 변경하십시오.

FileOutputStream fileOutput = new FileOutputStream(file); 
... 
xmlOutput.output(document, fileOutput); 

... 이제 두 번째 코드를 완료 한 것으로 보았습니다. 그렇습니다. 이것이 바람직한 접근 방법입니다. 여기서 스트림은 이진 데이터를 처리하기 때문에 사용할 인코딩에 대한 가정을하지 않습니다. XML 작성 코드는 그 바이너리 데이터가 무엇인지를 결정하고 실제로 사용하는 문자 인코딩이 파일의 시작 부분에서 선언과 일치하는지 확인할 수 있습니다.

당신은 또한 예외 처리를 정리한다 - 단지 스택 추적을 인쇄하고 실패를 계속하고 finally 블록 대신 try 블록의 끝에서 close를 호출하지 않습니다. 이 예외적으로을 진정으로 처리 할 수 ​​없다면 직접 스택 위로 전파하거나 (잠재적으로 메서드에 throws 절을 추가) catch하고 기록한 다음 예외 또는 더 적절한 원인을 래핑하여 다시 게시하십시오.

+0

마지막으로)). 정말 좋은 조언 주셔서 감사합니다) – Ray

+0

도움 주셔서 감사합니다, 드디어, FileOutputStream 작가로 변경, UTF - 8 문제를 해결 ~ – Fiona

0

올바르게 기억하면 xmlOutputter에 다음과 함께 "pretty"형식을 사용하도록 할 수 있습니다. new XMLOutputter (Format.,하지 않습니다,

2 공간 들여 쓰기와 공백 미화 을 수행하는 새로운 형식의 객체를 돌려줍니다 UTF-8 인코딩을 사용 getPrettyFormat()) 그래서 너무 I와

작동합니다 꽤있다 빈 요소를 확장하고 선언 및 인코딩을 포함하고 기본 엔터티 이스케이프 전략을 사용합니다. 반환 된 형식 인스턴스를 다른 인스턴스에 영향을주지 않고 조정할 수 있습니다.