我正在尝试从服务器中提取一些txt文件,但文件字符集是UTF-8。 我的代码能够下载文件,但它也产生了一些奇怪的字符。
悉尼海水淡化厂
如果我使用chrome直接下载它,它会正确显示为:
悉尼的海水淡化厂
以下是我目前的代码:
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标头吗?或读者是这里的问题?
答案 0 :(得分:4)
好的,这是交易,就像我在用你的网址尝试你的代码后所知道的那样。
首先,不要以为你有UTF-8。始终使用HTTP响应头中的任何字符编码。
在您的情况下,响应标头中没有实际编码,因此您必须回退到某个默认值。这就是事情的结果。
许多消息来源建议退回到windows-1252,它可以正确解码撇号。 text / html的默认值为iso-8859-1(http://www.w3.org/International/O-HTTP-charset),但iso-8859-1无法正确解码该字符。
我找不到任何硬引用,windows-1252应该是text / plain的默认值。但是,我发现的几乎每个text / plain请求的例子都默认为该编码。因此,我只能得出结论,它往往是安全的后备。
所以我会说:
InputStream
。不要假设utf-8。到目前为止我发现的所有内容都表明上述内容涵盖了大部分案例。我将继续四处搜寻确切的消息来源。