【问题标题】:How can I remove line feed character from a page from Internet which I may not know the encoding in java?如何从我可能不知道 Java 编码的 Internet 页面中删除换行符?
【发布时间】:2015-06-14 15:07:08
【问题描述】:

我正在开发一个蜘蛛从文本文件中读取 URL 并下载页面,将 URL 和文件内容写入另一个文件中,它们之间有一个 \t。

当我得到页面时,它可能包含应该移动的换行符。但是我在获取页面之前并不知道页面编码。

现在我正在使用 JSOUP ,因为它可以为我处理编码问题。但我发现 JSOUP 会解析 HTML 以找到使其变慢的编码。

有没有一种简单的方法可以从字符串或字节数组中删除换行符?

此代码是否适用于 UTF-8 或 GBK?

                        byte[] buffer=new byte[4096];
                        String page="";

                        while((input.read(buffer))!=-1){
                            for(int i=0;i<buffer.length;i++)
                                if(buffer[i]=='\r'||buffer[i]=='\n'){
                                    buffer[i]=' ';
                                }
                            page+=new String(page);
                        }

我发现上面的代码在 utf-8 中不起作用,因为亚洲语言中的字符可能长于 8 位或 16 位,所以当我将字节转换为字符串时,字符可能会被拆分。

以下代码对我来说很好用: int responseCode = connection.getResponseCode();

    if (responseCode >= 200 && responseCode < 300) {
                    InputStream input =connection.getInputStream();

                    byte[] buffer=new byte[BUFFER_SIZE];
                    byte[] urlBytes=(url+"\t").getBytes("ASCII");

                    System.arraycopy(urlBytes, 0, buffer, 0, urlBytes.length);
                    int t=0,index=urlBytes.length;
                    while((t=input.read())!=-1){
                        if(index>=buffer.length-1){ 
                            byte[] temp=new byte[buffer.length*3/2];
                            System.arraycopy(buffer, 0, temp, 0, buffer.length-1);
                            buffer=temp;
                        }
                        if(t=='\n'||t=='\r'){
                            t=' ';
                        }
                        buffer[index++]=(byte)t;
                    }
                    buffer[index++]='\n';

【问题讨论】:

  • 您可以使用正则表达式将所有出现的 \t 替换为空字符串。
  • 在获取页面之前您确实知道编码。它在响应标头中。
  • @EJP,是的,这就是 JSOUP 所做的。 JSOUP 尝试在 header 中查找编码(可能找不到编码),失败时会 prase html,在 html 中查找编码信息。但是我徘徊它很慢,当我从 JSOUP api 保存 html 时,JSOUP 从 DOM 中获取 HTML,这不是原始的。
  • 如果您不知道编码,则无法将字节流转换为字符流,您可以在其中搜索换行符。您的示例代码不适用于 UTF-16 编码文本。

标签: java string jsoup bytearray


【解决方案1】:

根据操作系统,新行可以是\n\r\n,或者有时是\r,但这些都是ASCII 字符,如果编码是ASCII 的超集,它们总是相同的。在这种情况下,只需删除页面中的所有 \r\n

但这不适用于其他编码,例如 UTF-16。

【讨论】:

  • 这将组合仅由换行符分隔的单词;最好用空格替换 CR LF 或它们的最佳非空序列。
  • 它们在所有字符编码中以相同的方式编码。特别是 UTF-16 和 UTF-8 的字节模式是不同的。
  • @Readwald 我编辑了我的答案。我会删除它,因为我意识到它实际上并没有真正回答问题,但我不能,因为它已被接受。
猜你喜欢
  • 2011-03-24
  • 1970-01-01
  • 2015-05-28
  • 1970-01-01
  • 2011-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多