Java SAX解析器不';无法识别windows-1255编码

Java SAX解析器不';无法识别windows-1255编码,java,android,encoding,rss,sax,Java,Android,Encoding,Rss,Sax,我正在安卓系统中开发rss解析器 (升级我在互联网上找到的解析器)。 据我所知,SAX解析器会从xml标记自动识别编码,但当我试图解析声明windows-1255编码的提要时,它不会解析它,并抛出和异常。 我尝试了几件事: 我甚至试着告诉他具体的编码 source.setEncoding("Windows-1255"); 试图查看定位器: @Override public void setDocumentLocator(Locator locator) { } 它能识别编码为UTF-1

我正在安卓系统中开发rss解析器 (升级我在互联网上找到的解析器)。 据我所知,SAX解析器会从xml标记自动识别编码,但当我试图解析声明windows-1255编码的提要时,它不会解析它,并抛出和异常。 我尝试了几件事:

  • 我甚至试着告诉他具体的编码

    source.setEncoding("Windows-1255");
    
  • 试图查看定位器:

    @Override
    public void setDocumentLocator(Locator locator) {
    }
    
  • 它能识别编码为UTF-16

    请帮我解决这个烦人的问题!
    抱歉,代码片段太乱了。由于某种原因,“代码”按钮无法工作。

    平台本身可能不知道“windows-1255”编码。毕竟,它是基于Windows的编码——我不想依赖它在任何其他平台上的可用性,尤其是移动平台,在移动平台上,事情通常被简化为“必备”选项。

    您需要将编码设置为InputStreamReader

    Reader isr = new InputStreamReader(feed, "windows-1255");
    final InputSource source = new InputSource(isr);
    
    从InputSource读取的逻辑如下:

    • 有字符流吗?如果有,就使用它(如果使用像InputStreamReader这样的读取器,就会发生这种情况)
    否则:

    • 没有字符流?使用字节流。(输入流)
    • InputSource是否有编码集?用那个
    • 没有编码集?尝试从xml文件解析编码

    rss
    是一种
    xml
    。是否在文档开头声明了编码?我的意思是
    我试着检查你说的话,所以我自己把流编码成一个字符串:
    byte[]arr=newbyte[4096];int bytesNum=feedStream.read(arr,04096);而(bytesNum>0){strings=newstring(arr,0,bytesNum,“windows-1255”);Log.i(“,s);System.out.println(s);bytesNum=feedStream.read(arr,04096);}返回null和字符串看起来很好(代码在android设备上运行,因此这意味着它确实支持windows-1255编码)。@Elad92:有趣,令人惊讶。在这种情况下,您可以将整个内容读入内存,将其转换为UTF-8,重写XML声明部分,然后让SAX在此时解析它。虽然不太令人愉快,但它应该可以工作……我尽量避免将所有流读取到内存中,因为这种解析必须尽可能轻,因为Android设备没有计算机般的处理能力。如果这段代码不在Android上运行,我会使用DOM解析器而不是SAX。。你还有别的想法吗?@Elad92:嗯。。。您可以尝试编写一个“流内编码转换器”,动态地将字节从windows-1255转换为UTF-8,并转换声明。不过,这可能很难实施:(@JonSkeet chars在UTF-8中比在windows-1255中需要更多的字节。就地转换几乎不起作用。我做了,它也起了作用,但我不能硬编码,因为提要采用不同的编码。我如何强制他从xml解析编码?如果你想从xml解析编码,只需使用新的InputSource(提要),不需要读卡器。当然,在这种情况下,您的xml文件需要从一开始就是这样做的,但它拒绝工作,当它到达第一个字符时,会抛出未知的编码异常。
    
    Reader isr = new InputStreamReader(feed, "windows-1255");
    final InputSource source = new InputSource(isr);