Android default charset when sending http post/put - Problems with special characters
Apparently, I forgot to set the StringEntity's charset to UTF-8. These lines did the trick:
httpPut.setEntity(new StringEntity(body, HTTP.UTF_8)); httpPost.setEntity(new StringEntity(body, HTTP.UTF_8));
So, there are at least two levels to set the charset in the Android client when sending an http post with non-ascii characters.
- The rest client itself itself
- The StringEntity
UPDATE: As Samuel pointed out in the comments, the modern way to do it is to use a ContentType, like so:
final StringEntity se = new StringEntity(body, ContentType.APPLICATION_JSON); httpPut.setEntity(se);
I know this post is a bit old but nevertheless here is a solution:
Here is my code for posting UTF-8 strings (it doesn't matter if they are xml soap or json) to a server. I tried it with cyrillic, hash values and some other special characters and it works like a charm. It is a compilation of many solutions I found through the forums.
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();
I hope that someone will find this code helpful. :)
You should set charset of your string entity to UTF-8:
StringEntity stringEntity = new StringEntity(urlParameters, HTTP.UTF_8);