【发布时间】: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