2011-03-19 3 views
4

rome (1.0)을 사용하여 피드 애그리 게이터를 생성하려고합니다. 모든 것이 작동하지만 피드의 charset에 문제가 있습니다. 난 맥 OS X (넷빈 6.9.1) 이상 자바 1.6을 사용하여 개발 중입니다. 내가 피드를 검색하려면 다음 코드를 사용하고charset 및 rome (rss/atom 피드) 문제

:

_source는 RSS 소스입니다
InputStream is = new URL(_source).openConnection().getInputStream(); 
SyndFeed feed = (SyndFeed) input.build(new InputStreamReader(is, Charset.forName(_charset))); 

(같은 http://rss.cnn.com/rss/edition.rss)와 _charset가 UTF-8 또는 ISO-8859-1이다.

작동하지만, 라틴 문자 (포르투갈어 등)가있는 일부 사이트는 두 가지 인코딩을 모두 사용하더라도 작동하지 않습니다.

Secretrio 드 그래서 파울로 (UTF-8)
Secretário 드의 탐구 £를 파울로 (O :

는 예를 들어, 항상 다음과 같은 더미의 문자를 반환합니다 http://oglobo.globo.com/rss/plantaopais.xml에서 읽을 피드 ISO-8859-1)

왜? 내가 놓친 게 있니?

로마에서 UTF-16과 같은 것을 사용하려고하면 오류가 발생합니다. com.sun.syndication.io.ParsingFeedException : 잘못된 XML : 행 1의 오류 : 프롤로그에서 내용을 사용할 수 없습니다.

내가 더 운과 US-ASCII와 같은 다른 인코딩을 시도했습니다

...

또 다른 질문 : 로마 (자바를 사용하여) 피드를 처리하는 가장 좋은 해결책이다? 로마에서 가장 최근 버전은 2009 년에서 일자 죽은 것 같다 1.0 ...

TIA,

밥이다

+0

이것은 http://stackoverflow.com/questions/8473410/while-parsing-rss-feed-through-rome-getting-content-is-not-allowed-in-prolog/14557915#14557915와 관련이 있습니다. 문제의 피드에는 더 이상 콘텐츠가 없으므로 바이트 순서 문제로 인해 테스트 할 수 없었습니다. –

답변

6

나는 는 로마 (당신이 득점에 성공하는 듯했으나, 몰라 귀하의 질문에 링크). ISO-8859-1은 링크 된 피드에 사용할 올바른 인코딩이어야합니다. 하지만 귀하의 도서관은 InputStream을 소스로 지원하지 않으므로 (XML 서문에 따라 올바른 인코딩을 찾겠습니까?)

출력이 프로그램 출력에 의해 처리 된 후에 왜곡 될 수 있습니까? 프로그램에

을 쓰고 그 결과를보고 할 수 있습니까? (자바 + 콘솔 조합이 잘 구성되어있는 경우는 "상파울루"이어야합니다.)


그래서, 지금 다운로드하고 컴파일 (메이븐에 의해 다른 물건의 다운로드 시간 반 걸렸다) 로마, 및 문제를 재현 할 수 있습니다. build 방법을 사용하는 경우 리더에 문제가있는 것 같습니다. 여기

가 (로마, JDOM과의 Xerces 클래스 경로에있는 경우) 작동하는 변종 :

package de.fencing_game.paul.examples.rome; 

import org.xml.sax.InputSource; 

import java.nio.charset.Charset; 
import java.io.*; 
import java.net.*; 

import com.sun.syndication.io.*; 
import com.sun.syndication.feed.synd.*; 

public class RomeTest { 

    public static void main(String[] ignored) 
     throws IOException, FeedException 
    { 
     String charset = "UTF-8"; 
     String url = "http://oglobo.globo.com/rss/plantaopais.xml"; 


     InputStream is = new URL(url).openConnection().getInputStream(); 
     InputSource source = new InputSource(is); 

     SyndFeedInput input = new SyndFeedInput(); 
     SyndFeed feed = input.build(source); 

     System.out.println("description: " + feed.getDescription()); 
    } 


} 

대신 ReaderInputStreamInputSource를 사용함으로써, 파서 자체가 권리를 알아 낸다 charset을 사용하고 올바르게 가져옵니다.소스에 주위에 조금 파고


, 우리 SyndFeed 차례로 자신을 제시하는 리더에 직면하면 혼란스러워 보인다 SAX XMLReader를,에 전달 JDOM에 Reader 또는 InputSource를, 통과 보인다 <?xml ... encoding="ISO-8859-1" ?>. 그런 다음 Xerces (여기 사용 된 것 같습니다) 소스에서 파고 들었지만 의심스러운 원인을 찾지 못했습니다.

+0

답변 해 주셔서 감사합니다. 나는 로마 프로젝트에 대한 링크를 제공했다. InputStream의 인코딩을 정의하는 경우와없는 경우에서 두 가지 방법을 시도했습니다. 결과는 동일합니다 (UTF-8을 사용하여 결과를 지정하지 않은 경우). 나는 시험을했고 효과가 있었다. 상파울루를 정확하게 인쇄했습니다. –

+0

대단히 감사합니다. 당신이 제안한 방식을 구현할 때 그것은 훌륭하게 작동했습니다. –

+0

@Bob : 이것은 소스 인코딩의 변경 사항을 조정할 때 다른 이점이 있습니다. –