我想在我的Android应用程序中使用以下代码执行HTTPRequest:
BufferedReader in = null;
try {
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet();
request.setURI(new URI("http://www.example.de/example.php"));
HttpResponse response = client.execute(request);
in = new BufferedReader
(new InputStreamReader(response.getEntity().getContent()));
StringBuffer sb = new StringBuffer("");
String line = "";
String NL = System.getProperty("line.separator");
while ((line = in.readLine()) != null) {
sb.append(line + NL);
}
in.close();
String page = sb.toString();
System.out.println(page);
return page;
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
我正在调用的网页是一个php脚本,它返回一个字符串。我的问题是,特殊字符(ä、ü、ö、€等)显示为带框的问号。我怎样才能得到这些字符?
我认为这是编码的问题(德语应用程序->UTF-8?)。
您可以尝试在控制台中显示时设置编码。某些字符从服务器正确返回,但无法在控制台中显示。
String page = sb.toString();
PrintStream out = new PrintStream(System.out, true, "UTF-8");
out.println(page);
我已经试过使用您的代码来对抗http://www.google.de
。
我能够"破解"一些东西,但不确定这是最优雅的解决方案。
线路后:
HttpResponse response = client.execute(request);
我添加了:
HttpEntity e = response.getEntity();
Header ct = e.getContentType();
HeaderElement[] he = ct.getElements();
if (
he.length > 0
&& he[0].getParameters().length > 0
&& he[0].getParameter(0) != null
&& he[0].getParameter(0).getName().equals("charset")
) {
String charset = he[0].getParameter(0).getValue();
// with google.de, will print ISO latin ("ISO-8859-1")
Log.d("com.example.test", charset);
}
然后,您可以添加字符集表示或其Java等价物,作为InputStreamReader
构造函数调用的第二个参数:
in = new BufferedReader(
new InputStreamReader(
response.getEntity().getContent(),
charset != null ? charset : "UTF-8"
);
如果你觉得合适,请告诉我。
还要注意,为了检查Java字符集的等效性,可以使用Charset.forName(String charsetName)
并捕获相关的Exception
s(然后在catch
语句中恢复为Charset.defaultCharset()
或UTF-8等)。