微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Android / Jsoup:如何解决编码问题

如何解决Android / Jsoup:如何解决编码问题

我正在开发一个使法律在线的应用程序,并自动对其进行解析和格式化以适合该应用程序。我正在使用的测试网站是

http://www.planalto.gov.br/ccivil_03/constituicao/constituicao.htm

我想获取该URL的所有内容,解析(也许是干净的)并将它们放入文件中。我正在使用Jsoup,这是我用来连接内容并将其打印到文件的Runnable:

class FetchHtmlRunnable implements Runnable {
        String url;

        FetchHtmlRunnable(String url) {
            this.url = url;
        }

        @Override
        public void run() {
            try {
                Document doc = Jsoup.parse(new URL(url),10000);
                doc.charset(Charset.forName("windows-1252"));
                Charset charset = doc.charset();

                String htmlString = Jsoup.clean(doc.toString(),new Whitelist());

                Log.d(TAG,"run: HTMLSTRING: " + htmlString);

                String root = context.getFilesDir().toString();
                file = new File(root + File.separator + "law.txt");

                OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(file,false),charset);
                out.write(htmlString);
            } catch (IOException ex) {
                ex.printstacktrace();
            }
        }
    }

但是,即使Chrome浏览器告诉我该网站的编码是Windows-1252,日志条目和文件中不仅填充了替换字符(带有变音符号的所有字符都丢失了,例如í和ã),它也丢失了所有新行:

Constitui��o Presid�ncia da Rep�blica Casa Civil Subchefia para Assuntos Jur�dicos CONSTITUI��O DA REP�BLICA FEDERATIVA DO BRASIL DE 1988 Vide Emenda Constitucional n� 91,de 2016 Vide Emenda Constitucional n� 106,de 2020 Vide Emenda Constitucional n� 107,de 2020 Emendas Constitucionais Emendas Constitucionais de Revis�o Ato das disposi��es Constitucionais Transit�rias Atos decorrentes do disposto no � 3� do art. 5� �NDICE TEM�TICO Texto compilado PRE�MBULO N�s,representantes do povo brasileiro,reunidos em Assembl�ia Nacional Constituinte para instituir um Estado Democr�tico,destinado a assegurar o exerc�cio dos direitos sociais e individuais,a liberdade,a seguran�a,o bem-estar,o desenvolvimento,a igualdade e a justi�a como valores supremos de uma sociedade fraterna,pluralista e sem preconceitos,fundada na harmonia social e comprometida

也许Web开发人员中的某个更好的人可以告诉我网页itlef是否存在问题,以及如何解决该问题……以及如何保留换行符。

解决方法

我将在短短的一秒钟内用葡萄牙语,西班牙语(和中文)写出关于字符集的答案的其余部分...不过,首先,我要说的是您要阅读的页面-实际上是加载了使用 "AJAX / JS" 的页面。我可以使用自己的Internet上的库下载 AJAX ,但是还需要其他工具,例如SeleniumPuppeteerSplash。不提及字符集,首先如何将“巴西宪法”的内容下载到HTML?当我尝试直接的HTML下载程序(不执行脚本)时,我得到了一堆Java脚本,而这些葡萄牙语根本没有任何葡萄牙语-它看起来根本不像您的问题中张贴的HTML。 :)

如果您已经在下载HTML,并且只对字符集有疑问,请阅读以下答案。如果除了AJAX / JavaScript调用之外,您无法下载其他任何内容-我可以发布另一个答案,以另一答案解释在一行或两行中执行JS / AJAX的过程。 (本质上,您发布的内容与我得到的输出不同)。


在99.9999%的情况下,如果它不是直接向上 "ASCII" (因为它具有外语字符),则(几乎)保证可以使用一个版本来读取它 "UTF-8" 的字符集。我翻译西班牙新闻文章和中文新闻文章- UTF-8 始终对我有用。我有一个西班牙语站点,该站点期望使用名为 "iso8859-1" 的编码,但是除了找到它的“ Don Quijote de La Mancha”站点以外,它都可以使用-UTF8。

说实话,这根本不是问题,因为 阅读网页 (而不是编写网页)时,Java会自动解析文本,就像没有任何配置的UTF-8一样。这是我编写的库中的“打开连接”方法主体:

HttpURLConnection con =                     (HttpURLConnection) url.openConnection();
con.setRequestMethod                        ("GET");
if (USE_USER_AGENT) con.setRequestProperty  ("User-Agent",USER_AGENT);
return new BufferedReader                   (new InputStreamReader(con.getInputStream()));

这是我的库中“抓取内容”方法的方法主体:

URL url = new URL("http://www.planalto.gov.br/ccivil_03/constituicao/constituicao.htm");
StringBuilder sb = new StringBuilder();
String s;
BufferedReader br = Scrape.openConn(url);
while ((s = br.readLine()) != null) sb.append(s + "\n");
FileRW.writeFile(sb.toString(),"page.html");

老实说,我不了解Microsoft字符集的第一件事。我已经在UNIX中进行编码,而且我从不担心任何字符集-除了确保在编写HTML时 (而不是 阅读HTML ),则HTML <META CHARSET="utf-8">元素已插入我的页面。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。