문제

공급 업체 중 하나는 때때로 UTF-8 인코딩 된 문서로 태그가 지정된 XML 피드를 보내지 만 UTF-8 찰스에 포함되지 않은 문자를 포함합니다. 이로 인해 파서가 예외를 던지고이 문자가 발생할 때 DOM 객체 구축을 중단합니다.

DocumentBuilder.parse(ByteArrayInputStream bais) 

다음 예외를 던집니다.

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

이러한 문제를 조기에 "캡처"하고 예외를 피하는 방법이 있습니까 (즉, 스트림에서 해당 문자를 찾고 제거)? 내가 찾고있는 것은 잘못 인코딩 된 문서에 대한 "최선의 노력"유형의 폴백입니다. 올바른 솔루션은 분명히 소스의 문제를 공격하고 올바른 문서 만 제공되는지 확인하는 것이지만, 불가능한 경우 좋은 접근 방식은 무엇입니까?

도움이 되었습니까?

해결책

문제가 실제로 잘못된 인코딩 인 경우 (혼합 인코딩과 반대로) 문서를 다시 인센트 할 필요가 없습니다. 입력 스트림 대신 독자로 구문 분석하면 Dom Parser는 헤더를 무시합니다.

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

다른 팁

유효하지 않은 문서를 수동으로 살펴보고 일반적인 문제가 무엇인지 확인해야합니다. 그들이 실제로 또 다른 인코딩 (아마도 Windows-1252)에있을 가능성이 높으며, 최상의 솔루션은 파손 된 시스템에서 모든 문서를 가져 와서 구문 분석하기 전에 UTF-8로 다시 코딩하는 것입니다.

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

또한 깨진 시스템이 수정 된시기를 알 수있는 방법이 필요하므로 해결 방법 사용을 중단 할 수 있습니다.

올바른 UTF-8을 보내라고 말해야합니다. 모든 솔루션이 잘못된 문자를 유효한 UTF-8으로 재개 해야하는 다음 파서에 전달해야합니다. 그 이유는 나쁜 캐릭터가 보존되면 다른 프로그램이 다른 방식으로 다른 방식으로 해석 될 수 있기 때문에 보안 구멍으로 이어질 수 있기 때문입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top