charset和rome的java问题(rss/atom提要)
我正在尝试使用rome(1.0)创建一个提要聚合器。一切正常,但我面临feed的字符集问题。我正在mac os x(netbeans 6.9.1)上使用java 1.6开发它
我使用以下代码检索提要:
InputStream is = new URL(_source).openConnection().getInputStream();
SyndFeed feed = (SyndFeed) input.build(new InputStreamReader(is, Charset.forName(_charset)));
其中_source
是rss源(如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之类的东西,rome会抛出一个错误:com。太阳辛迪加。伊奥。ParsingFeedException:第1行的XML:错误无效:prolog中不允许包含内容
我尝试过其他编码,比如US-ASCII,但没有幸运
另一个问题:rome是处理提要(使用java)的最佳解决方案吗?罗马的最新版本是2009年的1.0。似乎已经死了
蒂娅
鲍勃
# 1 楼答案
我不知道罗马(你可以在你的问题中加一个链接)。ISO-8859-1应该是用于链接的提要的正确编码。但是,您的库不支持
InputStream
作为源代码吗(这样它本身就可以通过XML前导查找正确的编码)是不是在你的程序的输出进行处理后,输出被篡改了?你能写信吗
并报告其输出?(如果Java+控制台组合配置正确,则应该是“圣保罗”。)
所以,我现在下载并编译了Rome(Maven花了半个小时下载了其他东西),我可以重现这个问题。看起来
build
方法获取读取器有问题下面是一个有效的变体(如果rome、jdom和xerces在类路径中):
通过使用带有
InputStream
而不是Reader
的InputSource
,解析器本身会找到正确的字符集,并使其正确在源代码中翻一翻,我们的SyndFeed似乎将读取器或InputSource传递给JDOM,JDOM又将其传递给SAX XMLReader,如果遇到一个以^{呈现的读取器,它似乎会感到困惑。然后我翻遍了Xerces的来源(似乎就是这里使用的那个),但没有发现任何可疑的原因