簡體   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