我看到了这篇文章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来请求以这种方式编码的参数?
答案 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字符在响应中也会被错误地读取。