如何从InputStream中删除重音字符

Sam*_*muh 5 android diacritics xml-parsing

我试图使用Pull解析器解析Android上的Rss2.0提要.

XmlPullParser parser = Xml.newPullParser();
parser.setInput(url.open(), null);
Run Code Online (Sandbox Code Playgroud)

feed XML的序言说编码是"utf-8".当我打开远程流并将其传递给我的Pull Parser时,我得到了无效的令牌,文档没有很好的异常.

当我保存XML文件并在浏览器(FireFox)中打开它时,浏览器报告文件中存在Unicode 0x12字符(严重重音?)并且无法呈现XML.

假设我对返回的XML没有任何控制权,处理此类情况的最佳方法是什么?

谢谢.

mdm*_*dma 6

你在哪里发现0x12是严重的重音?UTF-8的字符范围0x00-0x7F编码与ASCII相同,ASCII代码点0x12是控制字符DC2或CTRL + R.

这听起来像某种编码问题.解决这个问题的最简单方法是查看您在十六进制编辑器中保存的文件.有一些事情需要检查:

  1. 一开始的字节顺序标记(BOM)可能会混淆一些XML解析器
  2. 即使XML声明说编码是UTF-8,它实际上可能没有这种编码,并且文件将被错误地解码.
  3. 并非所有unicode字符在XML中都是合法的,这就是firefox拒绝呈现它的原因.特别是,XML规范说0x9,0xA和0xD是唯一小于0x20的有效字符,所以0x12肯定会导致兼容的解析器发牢骚.

如果你可以将文件上传到pastebin或类似文件,我可以帮助找到原因并建议解决方案.

编辑:好的,你无法上传.这是可以理解的.

您获得的XML在某种程度上已损坏,理想的操作方法是联系负责生成它的一方,以查看问题是否可以解决.

在做这件事之前要检查一件事 - 你确定你的数据不受干扰吗?某些形式的通信(SMS)仅允许7位字符.这会将0x92(ASCII正向刻度/撇号 - 严重重音?)转换为0x12.似乎非常巧合,特别是如果这些出现在您希望重音的文件中.

否则,你将不得不尽力做到最好:

  1. 虽然不是绝对必要的,但要防守并setInput在解析器上传递"UTF-8"作为第二个参数.

  2. 类似地,通过传递不同的编码作为第二个参数,强制解析器使用另一个字符编码.尝试添加"UTF-8"的编码是"iso-8859-1"和"UTF-16".Sun网站上提供了受支持的Java编码的完整列表- 您可以尝试所有这些.(我找不到Android支持的编码的确切列表.)

  3. 作为最后的手段,你可以删除无效字符,例如删除0x20以下不是空格的所有字符(0x9,0xA和0xD都是whitepsace.)如果很难删除它们,你可以替换它们.

例如

class ReplacingInputStream extends FilterInputStream
{
   public int read() throws IOException
   {
      int read = super.read();
      if (read!=-1 && read<0x20 && !(read==0x9 || read==0xA || read==0xB))
         read = 0x20;
      return read;          
   }
}
Run Code Online (Sandbox Code Playgroud)

您将它包装在现有输入流周围,并过滤掉无效字符.请注意,您可以轻松地做更多的伤害到XML,或者废话XML结束,但同样也可以让你得到你所需要或更容易看到问题所在的数据.