7

There is the following Java code:

    public static void register(UserInfo info) throws ClientProtocolException, IOException, JSONException, RegistrationException {
        List<NameValuePair> params=new ArrayList<NameValuePair>();
        params.add(new BasicNameValuePair("name", info.getName()));
        params.add(new BasicNameValuePair("email", info.getEmail()));
        params.add(new BasicNameValuePair("pass", info.getPassword()));
        params.add(new BasicNameValuePair("genus", String.valueOf(info.getGenus())));
        String response=doPostRequest(params, REGISTRATION_URL);
    }

private static String doPostRequest(List<NameValuePair> params, String url) throws ClientProtocolException, IOException {
    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost(url);

    httppost.setEntity(new UrlEncodedFormEntity(params));
    HttpResponse response = httpclient.execute(httppost); 

    return getContentFromInputStream(response.getEntity().getContent());
} 

private static String getContentFromInputStream(InputStream is) throws IOException {
    String line;
    StringBuilder sb=new StringBuilder();
    BufferedReader reader=new BufferedReader(new InputStreamReader(is));
    while((line=reader.readLine())!=null) {
        sb.append(line);
    }
    reader.close();
    return sb.toString();
}

As you can see above, I send POST request and get response. But in register method I use russian name (cyrillic), and there is "????? ???" on my server. How can I fix it? How can I encode russian text?

Menelaos
  • 23,508
  • 18
  • 90
  • 155
user2218845
  • 1,081
  • 4
  • 16
  • 21

6 Answers6

11

You need to set your request encoding to UTF-8.

The request or response body can be any encoding, but by default is ISO-8859-1. The encoding may be specified in the Content-Type header, for example:
Content-Type: text/html; charset=UTF-8

From: http://hc.apache.org/httpclient-3.x/charencodings.html

An example of how this is accomplished:

HttpClient httpclient = new HttpClient();
httpclient.getParams().setParameter("http.protocol.version", HttpVersion.HTTP_1_1);
httpclient.getParams().setParameter("http.protocol.content-charset", "UTF-8");

Additionally, I see your using UrlEncodedFormEntity. You should add encoding to the constructor as so:

new UrlEncodedFormEntity(nameValuePairs,"UTF-8");
Menelaos
  • 23,508
  • 18
  • 90
  • 155
  • Helpfull: http://stackoverflow.com/questions/5270591/post-utf-8-encoded-data-to-server-loses-certain-characters . Also, make sure your reading UTF-8 also on the server. – Menelaos Jun 10 '13 at 13:01
3

you should try encoding parameters

URLEncoder.encode(URL, "UTF-8");
shreyansh jogi
  • 2,082
  • 12
  • 20
0

Perhaps you are reading or writing the response wrong?

Make sure you use the same encoding in both writing the request and reading it and in the post http headers.

To define encoding for read data use InputStreamReader(InputStream, Charset) constructor.

Dariusz
  • 21,561
  • 9
  • 74
  • 114
0

httpclient.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, "UTF-8");

larryhu
  • 46
  • 4
0

If you tired of searching for correct headers / encoding combinations, you can encode string to URI format and decode back, this will preserve any non-ascii chars

String cyrillicString = "ыыыыыы";

//encode string into URI format
String transportString = URLEncoder.encode(cyrillicString, "UTF-8");

//transport string somewhere 

//decode back
String decodedString = URLDecoder.decode(transportString, "UTF-8");
JackHammer
  • 458
  • 1
  • 3
  • 16
0

If you post as json:

  1. Create client
HttpClientBuilder clientBuilder = HttpClients.custom();
//add header with charset UTF-8
clientBuilder.setDefaultHeaders(Arrays.asList(new BasicHeader(HttpHeaders.CONTENT_TYPE, ContentType.APPLICATION_JSON.getMimeType()))); //application/json;charset=UTF-8
CloseableHttpClient httpClient = clientBuilder.build();
  1. Create HttpPost
HttpPost post = new HttpPost("/hostIp:port/forexample/saveMyObject");
  1. Write object as string (String)
PostRequestExample request = new PostRequestExample();
request.setUsername("userName");
request.setUserAge(98));

ObjectMapper objectMapper = new ObjectMapper(); //import com.fasterxml.jackson.databind
//ContentType.APPLICATION_JSON - encode russian symbols as UTF8
post.setEntity(new StringEntity(objectMapper.writeValueAsString(request), ContentType.APPLICATION_JSON));
  1. execute
CloseableHttpResponse response = httpClient.execute(post);
pavel.kh
  • 1
  • 2