eri*_*son 32

一个非常常见的错误是无法将HTTP响应从字节正确转换为字符.为此,您必须知道响应的字符编码.希望这被指定为"Content-Type"参数中的参数.但是将它放在正文中,作为meta标记中的"http-equiv"属性也是一种选择.

因此,将页面加载到String正确的页面非常复杂,甚至像HttpClient这样的第三方库也不提供通用解决方案.

这是一个简单的实现,可以处理最常见的情况:

URL url = new URL("http://stackoverflow.com/questions/1381617");
URLConnection con = url.openConnection();
Pattern p = Pattern.compile("text/html;\\s+charset=([^\\s]+)\\s*");
Matcher m = p.matcher(con.getContentType());
/* If Content-Type doesn't match this pre-conception, choose default and 
 * hope for the best. */
String charset = m.matches() ? m.group(1) : "ISO-8859-1";
Reader r = new InputStreamReader(con.getInputStream(), charset);
StringBuilder buf = new StringBuilder();
while (true) {
  int ch = r.read();
  if (ch < 0)
    break;
  buf.append((char) ch);
}
String str = buf.toString();
Run Code Online (Sandbox Code Playgroud)

  • @TalWeiss人气无所谓; ISO-8859-1是[指定的默认值.](http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.7.1)."当发件人没有提供明确的字符集参数时,'text'类型的媒体子类型被定义为在通过HTTP接收时具有'ISO-8859-1'的默认字符集值.除了'ISO-之外的字符集中的数据8859-1'或其子集必须用适当的字符集值标记." (4认同)
  • @erickson我确实看到了你的观点,但这是阅读网络的代码,人们只是希望他们的代码能够运作.正如你所说的"希望最好" - 我不确定什么是最好的,就未在指定编码时代码实际工作的概率而言.我认为全球范围内你有更好的赔率UTF-8. (3认同)