如何从asyncTask发送http post请求中的unicode字符

时间:2014-09-02 04:26:05

标签: android unicode android-asynctask

我看到了这篇文章How to send unicode characters in an HttpPost on Android,但我在AsyncTask类中以这种方式请求。我的日志也在urlParameters中打印本地语言,但是服务器返回没​​有结果,而它非常适合英语字符串:

@Override
protected String doInBackground(String... URLs) {

    StringBuffer response = new StringBuffer();

    try {
        URL obj = new URL(URLs[0]);
        HttpURLConnection con = (HttpURLConnection) obj.openConnection();
        // add request header
        con.setRequestMethod("POST");

        if (URLs[0].equals(URLHelper.get_preleases)) {
            urlCall = 1;
        } else
            urlCall = 2;

        // String urlParameters = "longitude=" + longitude + "&latitude="+latitude;

        // Send post request
        con.setDoOutput(true);
        DataOutputStream wr = new DataOutputStream(con.getOutputStream());

        wr.writeBytes(urlParameters);
        wr.flush();
        wr.close();

        int responseCode = con.getResponseCode();
        if (responseCode == 200) {
            BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
            String inputLine;

            while ((inputLine = in.readLine()) != null) {
                response.append(inputLine);
            }
            in.close();
        }

    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    return response.toString();
}

有没有办法设置字符集UTF-8来请求以这种方式编码的参数?

1 个答案:

答案 0 :(得分:1)

  

String urlParameters ="经度=" +经度+"&纬度=" +纬度;

您需要将正在注入的组件进行URL编码到application/x-www-form-urlencoded上下文中。 (除非非ASCII字符,否则像&符号这样的字符会破坏。)

指定您在该调用中用于请求的字符串到字节编码,例如:

String urlParameters = "longitude=" + URLEncoder.encode(longitude, "UTF-8")...

...

  

DataOutputStream wr = new DataOutputStream(con.getOutputStream());

DataOutputStream用于沿流发送类似结构的Java类二进制数据。它没有为您提供编写HTTP请求主体所需的任何内容。也许你的意思是OutputStreamWriter

但是因为你已经将所有字符串都存储在内存中,所以你可以这样做:

con.getOutputStream().write(urlParameters.getBytes("UTF-8"))

(注意UTF-8这里有点多余。因为你已经将所有非ASCII字符的URL编码转换为%xx转义符,所以UTF-8编码没有任何内容。一般来说,指定一个特定的编码几乎总是比忽略它更好,并恢复到不可靠的系统默认编码。)

  

new InputStreamReader(con.getInputStream())

也省略了编码并恢复到默认编码,这可能不是响应的编码。因此,您可能会发现非ASCII字符在响应中也会被错误地读取。