Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从Internet上删除可能不知道java编码的页面中的换行符?_Java_String_Jsoup_Bytearray - Fatal编程技术网

如何从Internet上删除可能不知道java编码的页面中的换行符?

如何从Internet上删除可能不知道java编码的页面中的换行符?,java,string,jsoup,bytearray,Java,String,Jsoup,Bytearray,我正在开发一个从文本文件读取URL的爬行器,并下载该页面,然后将URL和文件内容写入另一个文件中,两者之间有一个\t 当我获取页面时,它可能包含应该移动的换行符。但是在我得到页面之前,我不知道页面编码 现在我正在使用JSOUP,因为它可以为我处理编码问题。但我发现JSOUP解析HTML以找到使其速度变慢的编码 有没有简单的方法可以从字符串或字节数组中删除换行符 此代码是否适用于UTF-8或GBK byte[] buffer=new byte[409

我正在开发一个从文本文件读取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);
                        }
byte[]buffer=新字节[4096];
字符串页=”;
while((input.read(buffer))!=-1){
对于(int i=0;i=200&&responseCode<300){
InputStream输入=连接。getInputStream();
字节[]缓冲区=新字节[缓冲区大小];
字节[]url字节=(url+“\t”).getBytes(“ASCII”);
arraycopy(urlBytes,0,buffer,0,urlBytes.length);
int t=0,index=urlBytes.length;
而((t=input.read())!=-1){
如果(索引>=buffer.length-1){
字节[]临时=新字节[缓冲区长度*3/2];
系统阵列复制(缓冲区,0,温度,0,缓冲区长度-1);
缓冲区=温度;
}
如果(t='\n'| t=='\r'){
t='';
}
缓冲区[索引++]=(字节)t;
}
缓冲区[index++]='\n';

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


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

您可能可以使用正则表达式将\t的所有出现替换为空字符串。在获取页面之前,您确实知道编码。它位于响应标头中。@EJP,是的,这是JSOUP所做的。JSOUP尝试在标头中查找编码(可能找不到编码),当失败时,它将使用html,在html中查找编码信息。但我认为它非常慢,当我从JSOUP api保存html时,JSOUP从DOM中获取html,这不是原始的html。如果您不知道编码,则无法将字节流转换为可以搜索行b的字符流reaks。您的示例代码不适用于UTF-16编码的文本。可能的重复代码将组合仅由换行符分隔的单词;最好用空格替换CR LF或它们的最佳非空序列。它们在所有字符编码中的编码方式都不相同。特别是,UTF-16和UTF-8的字节模式不同t、 @Readwald我编辑了我的答案。我会删除它,因为我意识到它实际上并不能回答问题,但我不能,因为它被接受了。
    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';