gpt4 book ai didi

java - HttpClient 下载包含损坏字符的 txt 文件

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:17:08 25 4
gpt4 key购买 nike

我正在尝试从服务器中提取一些 txt 文件,但是文件字符集是 UTF-8。我的代码能够下载文件,但它也产生了一些奇怪的字符。

Sydney�s Desalination Plant

如果我直接使用 chrome 下载它,它会正确显示为:

Sydney’s Desalination Plant

下面是我当前的代码:

public String getURL(String url) throws Exception
{
StringBuffer result=new StringBuffer();
if(StringUtils.isNotBlank(url) && url.startsWith("http"))
{
HttpClient client = new DefaultHttpClient();
client.getParams().setParameter("http.protocol.content-charset", "UTF-8");
HttpGet request = new HttpGet(url);

// add request header
//request.addHeader("User-Agent", "");
//request.addHeader(Content-Type: text/html; charset=UTF-8)
HttpResponse response = client.execute(request);

System.out.println("Response Code : " + response.getStatusLine().getStatusCode());
if(response.getStatusLine().getStatusCode() == 200)
{

//System.out.println(response.getEntity().getContentType().getValue());
BufferedReader rd = new BufferedReader(
new InputStreamReader(response.getEntity().getContent(),"UTF-8"));
//result=(EntityUtils.getContentCharSet(response.getEntity()));
boolean flagIn = false;
String sCurrentLine;
while ((sCurrentLine = rd.readLine()) != null)
{
//if(flagIn==false)
//{
// sCurrentLine = removeUTF8BOM(sCurrentLine);
//}

if(flagIn)
{
result.append("\n");
}
result.append(sCurrentLine);

flagIn = true;
}

}
}
return result.toString();

}

下面是试图调用的方法:

System.out.println(former.getURL("http://photos.gcdis-india.com/png/bio/QSPNGC1002.txt"));

知道我应该修复哪一部分吗?我需要提供任何特殊的 http header 吗?还是读者是这里的问题?

最佳答案

好的,这就是交易,在用您的 URL 尝试您的代码后我可以告诉您。

首先,不要假设你有 UTF-8。始终使用 HTTP 响应 header 中的任何字符编码。

在您的情况下,响应 header 中没有实际编码,因此您必须回退到某些默认值。这就是问题所在。

许多来源建议回退到 windows-1252,它可以正确解码撇号。 text/html 的默认值是 iso-8859-1 ( http://www.w3.org/International/O-HTTP-charset ) 但 iso-8859-1 不能正确解码该字符。

我找不到任何关于 windows-1252 应该是 text/plain 的默认值的硬性引用。但是,几乎每个文本/纯文本请求的示例我都能找到该编码的默认值。因此,我只能得出结论,它通常是一种安全的后备方案。

所以我想说:

  1. 从响应 header (或您的实体)中获取字符集。
  2. 如果没有并且您的内容类型是文本/纯文本,则默认为 windows-1252。如果您的内容类型是 text/html 默认为 iso-8859-1(编辑:或者如果您想要更健壮,首先将内容解码为 us-ascii,在 html 元标记中查找字符编码,然后解码就那样,否则是 iso-8859-1)。
  3. 将内容类型指定给 InputStream。不要假设为 utf-8。

到目前为止,我所发现的一切都表明以上内容涵盖了大多数情况。我将继续四处寻找确定的来源。

关于java - HttpClient 下载包含损坏字符的 txt 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18245547/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com