25

I upgraded my httpmime package, and now my strings are not sent or received as UTF-8

MultipartEntityBuilder entity = MultipartEntityBuilder.create();
Charset chars = Charset.forName("UTF-8");
entity.setCharset(chars);
entity.addTextBody("some_text", some_text);

HttpPost httppost = new HttpPost(url); 
httppost.setEntity(entity.build());
...and so on..

what am I missing? I used to build a StringBody and set the charset in the stringbody, but that is deprecated now, and it just doesn't seem to work

Amir.F
  • 1,911
  • 7
  • 29
  • 52

6 Answers6

23

Solved it :) it turns out that ContentType is now important, and I was sending text that was plain, and also some text that was JSON,

for the plain text, you can use:

entity.addTextBody("plain_text",plain_text,ContentType.TEXT_PLAIN);

and for JSON:

entity.addTextBody("json_text",json_text,ContentType.APPLICATION_JSON);

that way the charset also works on JSON strings (weird, but now OK)

Amir.F
  • 1,911
  • 7
  • 29
  • 52
  • As far as the document page http://hc.apache.org/httpcomponents-client-ga/httpmime/apidocs/org/apache/http/entity/mime/content/StringBody.html#StringBody(java.lang.String, org.apache.http.entity.ContentType) says, StringBody(String text, ContentType contentType, Charset charset) is not deprecated in 4.3.x – HirofumiTamori Oct 31 '13 at 07:44
21
entity.addTextBody("plain_text", plain_text);

will use the default ContentType.TEXT_PLAIN which look like this...

public static final ContentType TEXT_PLAIN = ContentType.create("text/plain", Consts.ISO_8859_1);

while ContentType.APPLICATION_JSON is using UTF-8 as below

public static final ContentType APPLICATION_JSON = ContentType.create("application/json", Consts.UTF_8);

So what i did was create our own ContentType like this..

entity.addTextBody("plain_text", plain_text, ContentType.create("text/plain", MIME.UTF8_CHARSET));
Pratik Butani
  • 60,504
  • 58
  • 273
  • 437
worawee.s
  • 598
  • 5
  • 11
10

For those who say the accepted solution did not work for them (it didn't for me either), I solved it a different way, using:

builder.addTextBody(key, שלום, ContentType.TEXT_PLAIN.withCharset("UTF-8"));
Nom1fan
  • 846
  • 2
  • 11
  • 27
2

Please try this for

Utf-8:

entity.addTextBody("your text", stringBuffer.toString(), ContentType.create("text/plain", Charset.forName("UTF-8")));
nAkhmedov
  • 3,522
  • 4
  • 37
  • 72
1

In my case, I setup the contentType first like this

ContentType contentType = ContentType.create(
                        HTTP.PLAIN_TEXT_TYPE, HTTP.UTF_8);

and when adding pairs , specify the content type like this

entityBuilder.addTextBody("title",pic.getTitle(),contentType);

as answered here MultipartEntityBuilder and setCharset for UTF-8 sends empty content

Community
  • 1
  • 1
Nevin Chen
  • 1,815
  • 16
  • 19
0

Changing the JSON string to BinaryUTF8 also is another way that works fine:

MultipartEntityBuilder meb = MultipartEntityBuilder.create();
meb.setCharset(java.nio.charset.StandardCharsets.UTF_8);
byte[] bytes = StringUtils.getBytesUtf8(some_text);
meb.addBinaryBody("JSON", bytes);
Siddharth
  • 884
  • 3
  • 11
  • 27