2008-10-19 3 views
4

Google의 제공 업체 중 하나가 때때로 UTF-8로 인코딩 된 문서로 태그가 지정되었지만 UTF-8 문자 세트에 포함되지 않은 문자를 포함하는 XML 피드를 보내고 있습니다.XML 파일의 잘못된 인코딩 수정

DocumentBuilder.parse(ByteArrayInputStream bais) 

는 다음과 같은 예외가 발생합니다 :

org.xml.sax.SAXParseException: Invalid byte 2 of 2-byte UTF-8 sequence. 

을하는 방법을 "캡처"이러한 문제를 초기에 거기에 이러한 문자가 발생하는 경우에 예외를 발생하고, DOM 객체를 구축 중지 파서 원인 예외 (즉, 스트림에서 해당 문자를 찾아 제거하는 것)를 피하십시오? 내가 찾고있는 것은 잘못 인코딩 된 문서에 대한 대체 최선책입니다. 올바른 해결책은 분명히 출처의 문제를 공격하고 올바른 문서 만 전달되는지 확인하는 것이지만 불가능할 때 좋은 접근 방법은 무엇입니까?

답변

4

문제가 진정으로 잘못된 인코딩 인 경우 (혼합 인코딩과 반대), 문서를 다시 인코딩하여 구문 분석 할 필요가 없습니다. 단지 헤더를 무시하는 리더 대신의의 InputStream와 DOM 파서로 구문 분석 :

DocumentBuilder.parse(new InpputSource(new InputStreamReader(inputStream, "<real encoding>"))); 
+0

팁 주셔서 감사. 그것은 예외를 피했지만 불행히도 불법적 인 문자가 추출 (및 필요)하는 식별자 문자열 안에있는 것처럼 보이기 때문에 불행히도 그다지 도움이되지 못했습니다. 그리고 지금은 잘못된 인코딩을 얻습니다. 나는 단지 콘텐츠 제공자들이 그들의 오류를 고칠 때까지 기다려야한다고 생각한다. – Burre

2

잘못된 문서를 수동으로 살펴보고 일반적인 문제가 무엇인지 확인해야합니다. 실제로 다른 인코딩 (아마도 windows-1252)에있을 가능성이 높습니다. 따라서 가장 좋은 해결책은 깨진 시스템의 모든 문서를 가져 와서 구문 분석 전에 UTF-8로 다시 코딩하는 것입니다.

또 다른 가능한 원인은 혼합 인코딩입니다 (일부 요소의 내용은 한 인코딩에 있고 다른 요소의 내용은 다른 인코딩에 있음). 수정하기가 더 어려울 것입니다.

또한 부러진 시스템이 고쳐지면 해결 방법 사용을 중단 할 수있는 방법을 알아야합니다.

+0

같은 소스의 다른 데이터가 잘 작동하기 때문에 혼합 인코딩 (또는 단지 "불량"문자)이있는 것으로 판단됩니다. 스웨덴에 위치 이름이 포함되어 있기 때문에 일부 문자는 제대로 인코딩되지 않은 것 같습니다. – Burre

0

당신은 당신에게 UTF-8 올바른을 보내달라고 말해야한다. 어떤 솔루션이라도 잘못된 문자를 유효한 UTF-8로 다시 인코딩하지 못하면 파서에 전달해야합니다. 그 이유는 나쁜 문자가 보존되면 다른 프로그램이 출력을 다른 방식으로 해석하여 보안 허점을 초래할 수 있기 때문입니다.