繁体   English   中英

Android/Jsoup:如何修复编码问题

[英]Android/ Jsoup: how to fix encoding issues

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

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 ea justi a como valores supremos de uma sociedade fraterna, pluralista e sem preconceitos, fundada na harmonia social e comprometida

也许更擅长网络开发的人可以告诉我这是否是网页本身的问题以及我如何解决这个问题......以及我如何保留换行符。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM