タイトル通りです。
どうぞよろしくお願いいたします。
非常に一般的なエラーは、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();
org.Apache.commons.io.IOUtils
を使用すると、少し簡単にすることができます。
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";
String str = IOUtils.toString(con.getInputStream(), charset);
私はこれを使います:
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(
new URL(urlToSeach)
.openConnection()
.getInputStream() ));
StringBuilder sb = new StringBuilder();
String line = null;
while( ( line = bufferedReader.readLine() ) != null ) {
sb.append( line ) ;
sb.append( "\n");
}
.... in finally....
buffer.close();
ほとんどの場合、機能します。