Android HTTP请求编码



我想在我的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)并捕获相关的Exceptions(然后在catch语句中恢复为Charset.defaultCharset()UTF-8等)。

最新更新