Bob*_*ers 4 java feed character-encoding rome
我正在尝试使用rome(1.0)创建一个feed聚合器.一切正常,但我遇到饲料字符集的问题.我正在使用java 1.6在mac os x(netbeans 6.9.1)上开发它.
我正在使用以下代码来检索Feed:
InputStream is = new URL(_source).openConnection().getInputStream();
SyndFeed feed = (SyndFeed) input.build(new InputStreamReader(is, Charset.forName(_charset)));
Run Code Online (Sandbox Code Playgroud)
_sourcerss源(如http://rss.cnn.com/rss/edition.rss)在哪里,_charset是UTF-8或ISO-8859-1.
它有效,但有些网站有拉丁字符(如葡萄牙语)它甚至不使用两种编码.
例如,从http://oglobo.globo.com/rss/plantaopais.xml读取的源将始终返回虚拟字符,如下所示:
秘鲁圣保罗(UTF-8)
秘鲁圣保罗(ISO-8859-1)
为什么?我错过了什么吗?
如果我尝试使用像UTF-16这样的东西,罗马会抛出一个错误:com.sun.syndication.io.ParsingFeedException:无效的XML:第1行的错误:prolog中不允许使用内容.
我尝试过其他编码,比如US-ASCII,没有幸运...
另一个问题:罗马是处理Feed的最佳解决方案(使用java)?来自罗马的最新版本是从2009年开始的1.0版本.似乎已经死了......
TIA,
短发
我不知道罗马(你可以在你的问题中加上一个链接).ISO-8859-1应该是用于链接的Feed的正确编码.但是你的库不支持InputStream作为源(因此它本身会通过XML前导码查找正确的编码)吗?
可能是在程序输出处理之后输出会出现乱码吗?你能写吗?
System.out.println("S\u00e3o Paulo");
Run Code Online (Sandbox Code Playgroud)
在你的程序中并报告其输出?(如果您的Java +控制台组合配置正确,它应该是"圣保罗".)
所以,我现在下载并编译了罗马(由Maven下载其他东西花了半个小时),我可以重现这个问题.看起来像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());
}
}
Run Code Online (Sandbox Code Playgroud)
通过使用InputSourcewith InputStream而不是a Reader,解析器本身找到正确的字符集,并使其正确.
在源代码中挖掘一下,似乎我们的SyndFeed将Reader或InputSource传递给JDOM,而JDOM又将它传递给SAX XMLReader,如果面对一个能够呈现的Reader,它似乎会感到困惑<?xml ... encoding="ISO-8859-1" ?>.然后我在Xerces的源头(这似乎是这里使用的那个)中挖了一下,但是没有发现任何会导致这种情况的可疑.