我遇到了sax解析器和编码文本的问题。我尝试用ISO-8859-2(http://www.sbazar.cz/rss.xml?keyword=pes)解析RSS:
InputStream responseStream = connection.getInputStream();
Response response = mRequest.createResponse();
Reader reader = new InputStreamReader(responseStream);
InputSource is = new InputSource(reader);
is.setEncoding("ISO-8859-2");
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
saxParser.parse(is, response);
但解析器返回带有奇怪符号的字符串。我尝试了很多东西,但没有任何帮助我:(有人能帮帮我吗?
答案 0 :(得分:2)
您是否尝试过设置InputStreamReader的字符集:
Reader reader = new InputStreamReader(responseStream, Charset.forName("ISO-8859-2"));
InputSource is = new InputSource(reader);
如果你没有指定字符集,则InputStreamReader(InputStream)构造函数使用默认字符集(在我的机器中是windows-1252)。
因此,在您当前的设置中,字节被解释为(可能)windows-1252个字符,之后我认为您不能将它们重新解释为ISO-8859-2。
答案 1 :(得分:1)
InputSource is = new InputSource(responseStream)
可能在你的情况下你想要一个硬编码编码,你得到了如何做到这一点的答案。但我正在寻找一个通用的解决方案,在这里找到一个:Howto let the SAX parser determine the encoding from the xml declaration?
文档:InputSource in java 5(请注意,java 1.4文档缺少关键句子)。 使用诸如XML规范中的算法之类的算法自动检测字符编码。这指的是字节流,但不是字符流( Reader )
当我在XML文档(Autodetection of Character Encodings)中挖掘更多内容时,我找到了处理 Reader 和 Stream 之间区别的解释。要应用所有编码算法,Sax必须能够访问原始流,而不是转换为字符,因为转换可能会损坏字节标记。
答案 2 :(得分:0)
最后,我使用Rome library解决了我的问题。它也适用于ISO-8859-2。以下是源代码,如何使用罗马:
String urlstring = "http://www.sbazar.cz/rss.xml?keyword=pes";
InputStream is = new URL(urlstring).openConnection().getInputStream();
SyndFeedInput input = new SyndFeedInput();
SyndFeed feed = (SyndFeed)input.build(new InputStreamReader(is, Charset.forName("ISO-8859-2")));
Iterator entries = feed.getEntries().iterator();
while (entries.hasNext())
{
SyndEntry entry = (SyndEntry)entries.next();
Log.d("RSS", "-------------");
Log.d("RSS", "Title: " + entry.getTitle());
Log.d("RSS", "Published: " + entry.getPublishedDate());
if (entry.getDescription() != null)
{
Log.d("RSS", "Description: " + entry.getDescription().getValue());
}
if (entry.getContents().size() > 0)
{
SyndContent content = (SyndContent)entry.getContents().get(0);
Log.d("RSS", "Content type=" + content.getType());
Log.d("RSS", "Content value=" + content.getValue());
}
}