在使用HtlmCleaner的Android上,非英语字符解码不正确

时间:2011-01-20 12:41:35

标签: java android encoding html-parsing

我正在使用HtmlCleaner来抓取Android中的ISO-8859-1个编码网站。

我已在导入我的Android应用的外部jar文件中实现了此功能。

当我在Eclipse中运行单元测试时,它处理挪威字母(æ,ø,å)是正确的(我可以在调试器中验证),但在Android应用程序中,这些字符看起来像倒置的问号。

如果我将调试器附加到我的Android应用程序,我可以看到这些字母在从Eclipse运行单元测试时在完全相同的位置上是不正确的,所以它不是Android应用程序中的显示/渲染/视图问题

当我从调试器中复制文本时,我得到了以下结果:

Java流程(单元测试):«Blårek»,«Benny»

Android流程(在模拟器中):«Bl rek»,«Benny»

我希望这些字符串是相同的,但请注意Android中的反转问号如何替换“å”。

我试过运行htmlCleaner.getProperties().setRecognizeUnicodeChars(true)没有运气。另外,我发现无法在html清理器中强制使用UTF-8或ISO-8859-1编码,但我不确定这是否会产生影响。

以下是我运行的代码:

HtmlCleaner htmlCleaner = new HtmlCleaner();

// connect to url and get root TagNode from HtmlCleaner
InputSteram is = new URL( url ).openConnection().getInputStream();
TagNode rootNode = htmlCleaner.clean( is );

// navigate through some TagNodes, getting the ContentNode 
ContentNode cn = rootNode... 

// This String contains the incorrectly decoded characters on Android. 
// Good in Oracle JVM though..
String value = cn.toString().trim();

有谁知道什么可能导致解码行为在Android上有所不同?我猜这两种环境的主要区别在于Android应用程序使用Android的java.io堆栈,而我的单元测试使用Sun / Oracle的堆栈。

谢谢,
盖尔

1 个答案:

答案 0 :(得分:0)

HtmlCleaner无法分辨使用哪种编码;您只传递InputStream中的响应正文,但编码位于“内容类型”标题中。

您可以set the character encodingHtmlCleaner的属性进行HTTP连接中的正确编码。但这需要您从内容类型标头中解析正确的参数。或者,您可以pass a URL instance to HtmlCleaner让它管理连接。然后,它将可以访问正确解码所需的所有信息。