【问题标题】:SAX Parser doesn't recognize windows-1255 encodingSAX 解析器无法识别 windows-1255 编码
【发布时间】:2012-03-29 18:13:05
【问题描述】:

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

  1. final InputSource source = new InputSource(feed);
    Reader isr = new InputStreamReader(feed);
    source.setCharacterStream(isr);
    
  2. 我什至试着告诉他具体的编码。

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

    @Override
    public void setDocumentLocator(Locator locator) {
    }
    

并将编码识别为 UTF-16。

请帮我解决这个烦人的问题! 对不起,代码sn-ps代码按钮由于某种原因拒绝工作。

【问题讨论】:

  • rss 是一个xml。文档开头是否声明了编码?我的意思是<?xml version="1.0" encoding="windows-1255" ?>

标签: java android encoding rss sax


【解决方案1】:

平台本身可能不知道“windows-1255”编码。毕竟,它是一种基于 Windows 的编码——我不想依赖它在任何其他平台上都可用,尤其是那些通常被缩减为“必备”选项的移动平台.

【讨论】:

  • 我试着检查你所说的所以我自己把流编码成一个字符串:byte[] arr = new byte[4096]; int bytesNum = feedStream.read(arr, 0, 4096); while (bytesNum > 0){ String s = new String(arr, 0, bytesNum, "windows-1255"); Log.i("", s); System.out.println(s); bytesNum = feedStream.read(arr, 0, 4096); } return null; 字符串看起来很好(代码在 android 设备上运行,所以这意味着它确实支持 windows-1255 编码)。
  • @Elad92:有趣且令人惊讶。在这种情况下,您可以将整个内容读入内存,将其转换为 UTF-8,重写 XML 声明部分,然后让 SAX 在此时对其进行解析。不是很愉快,但它应该工作......
  • 我尽量避免将所有流读入内存,因为这种解析必须尽可能轻松,因为 Android 设备不具备类似计算机的处理能力。如果这段代码不应该在 Android 上运行,我会使用 DOM 解析器而不是 SAX。你还有其他想法吗?
  • @Elad92: 嗯...您可以尝试编写一个“流内编码转换器”,将字节从 windows-1255 即时转换为 UTF-8 and 转换声明。不过,这可能很难实现:(
  • UTF-8 中的 @JonSkeet 字符占用的字节数比 windows-1255 中的多。就地转换几乎行不通。
【解决方案2】:

您需要将编码设置为 InputStreamReader。

Reader isr = new InputStreamReader(feed, "windows-1255");
final InputSource source = new InputSource(isr);

javadoc 读取 InputSource 的逻辑是这样的:

  • 有字符流吗?如果有,请使用它(如果您使用像 InputStreamReader 这样的阅读器会发生这种情况)

否则:

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

【讨论】:

  • 我做到了,它成功了,但我不能硬编码,因为提要采用不同的编码。我怎样才能强迫他从 xml 解析编码?
  • 如果你想从xml解析编码,只需使用new InputSource(feed),不需要Reader。当然,在这种情况下,您的 xml 文件需要以 开头
  • 这就是我最初所做的,但它拒绝工作,当它到达第一个字符时,它会抛出一个未知的编码异常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-30
  • 1970-01-01
相关资源
最近更新 更多