【问题标题】:Android/ Jsoup: how to fix encoding issuesAndroid/ Jsoup:如何解决编码问题
【发布时间】:2021-01-09 19:40:53
【问题描述】:

我正在开发一个应用程序来在线获取立法并自动解析和格式化它以适应应用程序。我正在使用的测试站点是

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

也许在网络开发方面做得更好的人可以告诉我这是否是网页本身的问题以及我该如何解决这个问题...以及如何保留换行符。

【问题讨论】:

    标签: java android html jsoup


    【解决方案1】:

    我将在一秒钟内用葡萄牙语,西班牙语(和中文)写下这个关于字符集的答案的其余部分......不过,首先,让我说你正在尝试阅读的页面 - 实际上加载了使用 "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()));
    

    这是我的库中“Scrape Contents”方法的方法体:

    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"> 元素被插入到我的页面中。

    【讨论】:

    • 感谢您的详细解答!我也有一些 JS,这取决于我如何对连接进行编码,但是当使用 Jsoup 时,我正确地获取了页面的内容 - 编码错误。这很奇怪,因为我可以手动打开页面的源代码,将其保存到文件中并很好地解析该文件,而无需担心字符集;当我尝试使用 URLConnection 或 Jsoup 自动执行此操作时,编码会出错。也许在将字符集更改为 ASCII 或其他东西的过程中有些东西,但我会研究其他获取它的方法。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2020-02-27
    • 2017-10-03
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    • 1970-01-01
    • 2011-12-03
    • 1970-01-01
    相关资源
    最近更新 更多