Android默认字符集时发送http post / put - 具有特殊字符的问题吗?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (64)

我已经像这样配置了apache httpClient:

HttpProtocolParams.setContentCharset(httpParameters, "UTF-8");
HttpProtocolParams.setHttpElementCharset(httpParameters, "UTF-8");

对于所有http post和put请求,我还包含http标头“Content-Type:application / json; charset = UTF-8”。

我试图用包含特殊字符的json正文(即通过Google拼音键盘,符号等的中文字符)发送http post / put请求。字符在日志中显示为乱码,但我认为这是因为DDMS会不支持UTF-8。

有没有一种方法来设置Android中所有输入小部件的字符集?或者,也许我错过了其他客户端配置中的东西?或者,也许,也许,服务器小伙子没有在他们的服务器上使用UTF-8,而是使用Windows字符集呢?

提问于
用户回答回答于

显然,我忘了将StringEntity的字符集设置为UTF-8。这些线路做到了诀窍:

    httpPut.setEntity(new StringEntity(body, HTTP.UTF_8));
    httpPost.setEntity(new StringEntity(body, HTTP.UTF_8));

因此,在发送非ASCII字符的http文章时,至少有两个级别可以设置Android客户端中的字符集:

  1. 其余的客户端本身
  2. StringEntity

更新:正如塞缪尔在评论中指出的那样,现代的做法是使用ContentType,如下所示:

    final StringEntity se = new StringEntity(body, ContentType.APPLICATION_JSON);
    httpPut.setEntity(se);
用户回答回答于

我知道这篇文章有点老,但不过这里是一个解决方案:

这里是我的代码,用于发布UTF-8字符串(不管它们是xml soap还是json)到服务器。我用西里尔文,哈希值和一些其他特殊字符尝试它,它的作用就像一个魅力。这是我通过论坛找到的许多解决方案的汇编:

HttpParams httpParameters = new BasicHttpParams();
HttpProtocolParams.setContentCharset(httpParameters, HTTP.UTF_8);
HttpProtocolParams.setHttpElementCharset(httpParameters, HTTP.UTF_8);

HttpClient client = new DefaultHttpClient(httpParameters);
client.getParams().setParameter("http.protocol.version", HttpVersion.HTTP_1_1);
client.getParams().setParameter("http.socket.timeout", new Integer(2000));
client.getParams().setParameter("http.protocol.content-charset", HTTP.UTF_8);
httpParameters.setBooleanParameter("http.protocol.expect-continue", false);
HttpPost request = new HttpPost("http://www.server.com/some_script.php?sid=" + String.valueOf(Math.random()));
request.getParams().setParameter("http.socket.timeout", new Integer(5000));

List<NameValuePair> postParameters = new ArrayList<NameValuePair>();
// you get this later in php with $_POST['value_name']
postParameters.add(new BasicNameValuePair("value_name", "value_val"));

UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(postParameters, HTTP.UTF_8);
request.setEntity(formEntity);
HttpResponse response = client.execute(request);

in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
StringBuffer sb = new StringBuffer("");
String line = "";
String lineSeparator = System.getProperty("line.separator");
while ((line = in.readLine()) != null) {
    sb.append(line);
    sb.append(lineSeparator);
}
in.close();
String result = sb.toString();

扫码关注云+社区