2012-03-16 2 views
21

UTF-8 파일에서 BOM을 제거하고 나머지 xml 파일의 복사본을 만드는 방법에 대한 제안이 필요합니다.Java의 XML 파일에서 BOM을 제거하는 방법

+1

downvotes 때문에 중복으로하지 않습니다, 그들은이 질문은 너무 광범위하고 있기 때문에 :

그리고 여기뿐만 아니라 다른 인코딩을 포함, 더 완전한 답변과 질문에 대한 링크입니다 사실 - stackoverflow 특정, 지역화 된 프로그래밍 문제를 돕기위한 것입니다. 우리는 프로그램을 디버그하도록 도울 수 있습니다. 우리는 프로그램을 작성하지 않을 것입니다. –

+0

응답하기 전에 -5가되기를 기다리고 있습니다.) – TacticalCoder

+0

@ 하리 : 파일의 인코딩은 무엇입니까? UTF-8? – TacticalCoder

답변

32

UTF-8 파일의 BOM으로 인해 도구가 손상되는 것은 내 경험에 공통적 인 부분이입니다. 왜 그렇게 많은 downvotes (하지만 그때 나에게 특별한 SO 배지를 이기기 위해 충분한 투표를 얻을 수있는 기회를 제공합니다;)

더 심각하게 : UTF - 8 BOM은 일반적으로 만들지 않습니다 그 정도의 의미는 이지만입니다. 사양에 따라 완전히 유효합니다 (권장하지는 않지만). 이제 문제는 많은 사람들이 BOM이 UTF-8에서 유효하다는 것을 인식하지 못해서 이러한 파일을 올바르게 처리하지 못하는 깨진 도구/API를 작성한다는 것입니다.

이제는 Java에서 파일을 처리하거나 Java를 사용하여 다른 (깨진) 도구에 필요한 파일을 프로그래밍 방식으로 작성/수정해야하는 등 두 가지 문제가 발생할 수 있습니다.

필자는 헬프 데스크가 Java에서 생성 한 완벽하게 유효한 UTF-8 파일을 엉망으로 만들 수있는 텍스트 편집기에 문제가있는 사용자로부터 메시지를 계속받을 수있는 한 번의 컨설팅에서이 사례를 보았습니다. 그래서 우리가 다루고있는 모든 단일 UTF-8 파일에서 BOM을 제거하여이 문제를 해결해야했습니다.

파일에서 BOM을 삭제하려면 새 파일을 만들고 처음 3 바이트를 건너 뛸 수 있습니다. 예를 들어 당신이 볼 수 있듯이

... $ file /tmp/src.txt 
/tmp/src.txt: UTF-8 Unicode (with BOM) English text 

... $ ls -l /tmp/src.txt 
-rw-rw-r-- 1 tact tact 1733 2012-03-16 14:29 /tmp/src.txt 

... $ hexdump -C /tmp/src.txt | head -n 1 
00000000 ef bb bf 50 6f 6b 65 ... 

는 파일이이 (완전 유효) UTF-8 BOM있다 "EF의 BB 탄 BF"로 시작합니다. 그것은 "원시"있다고

public static void workAroundbrokenToolsAndAPIs(File sourceFile, File destFile) throws IOException { 
    if(!destFile.exists()) { 
     destFile.createNewFile(); 
    } 

    FileChannel source = null; 
    FileChannel destination = null; 

    try { 
     source = new FileInputStream(sourceFile).getChannel(); 
     source.position(3); 
     destination = new FileOutputStream(destFile).getChannel(); 
     destination.transferFrom(source, 0, source.size() - 3); 
    } 
    finally { 
     if(source != null) { 
      source.close(); 
     } 
     if(destination != null) { 
      destination.close(); 
     } 
    } 
} 

참고 : 여기에

은 파일을 받아 처음 세 바이트를 건너 뛰는하여 복사본을 만드는 방법입니다 당신이 일반적으로 먼저 당신이이 있는지 확인 싶어 BOM을 호출하기 전에 또는 "나쁜 생각이 생길 수있다"[TM]. 당신은 단순히 투명하게 한 당신의 깨진 자바 API의 BOM을 제거 할 경우는 지금 ...

... $ file /tmp/dst.txt 
/tmp/dst.txt: UTF-8 Unicode English text 

... $ ls -l /tmp/dst.txt 
-rw-rw-r-- 1 tact tact 1730 2012-03-16 14:41 /tmp/dst.txt 

... $ hexdump -C /tmp/dst.txt 
00000000 50 6f 6b 65 ... 

을 그리고 BOM은 사라 :

당신은 나중에 파일을 볼 수 있습니다 여기에 설명 된 pushbackInputStream 사용할 수 있습니다이 작동 why org.apache.xerces.parsers.SAXParser does not skip BOM in utf8 encoded xml?

private static InputStream checkForUtf8BOMAndDiscardIfAny(InputStream inputStream) throws IOException { 
    PushbackInputStream pushbackInputStream = new PushbackInputStream(new BufferedInputStream(inputStream), 3); 
    byte[] bom = new byte[3]; 
    if (pushbackInputStream.read(bom) != -1) { 
     if (!(bom[0] == (byte) 0xEF && bom[1] == (byte) 0xBB && bom[2] == (byte) 0xBF)) { 
      pushbackInputStream.unread(bom); 
     } 
    } 
    return pushbackInputStream; } 

참고하지만, defin된다 itely NOT 작업 체인의 다른 도구가 BOM이있는 UTF-8 파일과 올바르게 작동하지 않을 수있는보다 심각한 문제를 수정했습니다.

Byte order mark screws up file reading in Java

+0

투표 수 질문의 * 주제 *에 대한 판단이 아니며, 질문의 품질 *에 대한 판단입니다. 투표 버튼에 대한 툴팁을보십시오. – skaffman

+1

@skaffman : 괜찮아요.하지만 downvoting 대신에 OP가 UTF-8 파일을 사용하고 있는지 물어 보았습니다. (나는이 문제에 대해 의심 스러웠습니다.) 그리고 질문에 추가했습니다. (그리고 태그를 편집했습니다.) 나는 다른 말을 할 수 있을지 모르겠다. * "파일에서 BOM을 제거하는 방법"*은 아주 자명하다. "UTF-8"을 추가했습니다. 물론 나는 단순히 downvote하는 것이 더 쉬웠을 것이다.) – TacticalCoder

+0

@TacticalCoder는 ur 제안을 많이 주셔서 감사합니다. 나는 이것이 내가 가진 pblm을 해결할 것이라고 확신한다. – hari

관련 문제