通过MultipartEntity发送Unicode字符

时间:2014-09-04 12:11:27

标签: android apache http utf-8 multipartform-data

我有一种使用MultipartEntity内容类型将图像和文本作为HttpPost发送的方法。一切都适用于英文符号,但对于unicode符号(例如Cyrliics),它只发送???。所以,我想知道,如何正确设置MultipartEntity的UTF-8编码,因为我已经尝试了几个苏打,在SO上建议,但没有一个工作。 我已经在这里:

HttpClient httpclient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);

MultipartEntityBuilder mpEntity = MultipartEntityBuilder.create();
mpEntity.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
mpEntity.setCharset(Consts.UTF_8);

mpEntity.addPart("image", new FileBody(new File(attachmentUri), ContentType.APPLICATION_OCTET_STREAM));


ContentType contentType = ContentType.create(HTTP.PLAIN_TEXT_TYPE, HTTP.UTF_8);
StringBody stringBody = new StringBody(mMessage, contentType);
mpEntity.addPart("message", stringBody);

final HttpEntity fileBody = mpEntity.build();
httpPost.setEntity(fileBody);  

HttpResponse httpResponse = httpclient.execute(httpPost);

UPD 我根据@Donaudampfschifffreizeitfahrt建议尝试使用InputStream。现在我得到了 角色。

 InputStream stream = new ByteArrayInputStream(mMessage.getBytes(Charset.forName("UTF-8")));
 mpEntity.addBinaryBody("message", stream);

也尝试过:

mpEntity.addBinaryBody("message", mMessage.getBytes(Charset.forName("UTF-8")));

3 个答案:

答案 0 :(得分:3)

我用不同的方式解决了它,使用:

builder.addTextBody(key, שלום, ContentType.TEXT_PLAIN.withCharset("UTF-8"));

答案 1 :(得分:1)

您可以使用以下行在多部分实体中添加部分

entity.addPart(“Data”,new StringBody(data,Charset.forName(“UTF-8”)));

在请求中发送unicode。

答案 2 :(得分:0)

对于那些坚持这个问题的人,我就是这样解决的:

我调查了apache http组件库的源代码,发现如下:

org.apache.http.entity.mime.HttpMultipart::doWriteTo()


case BROWSER_COMPATIBLE:
    // Only write Content-Disposition
    // Use content charset

    final MinimalField cd = part.getHeader().getField(MIME.CONTENT_DISPOSITION);
    writeField(cd, this.charset, out);
    final String filename = part.getBody().getFilename();
    if (filename != null) {
        final MinimalField ct = part.getHeader().getField(MIME.CONTENT_TYPE);
        writeField(ct, this.charset, out);
    }
    break;

所以,似乎它是apache lib中的某种bug / feature,它只允许将Content-type头添加到MultipartEntity的一个部分,如果这部分的文件名不是null。所以我修改了我的代码:

Charset utf8 = Charset.forName("utf-8");
ContentType contentType = ContentType.create(ContentType.TEXT_PLAIN.getMimeType(), utf8);
ContentBody body = new ByteArrayBody(mMessage.getBytes(), contentType, "filename");
mpEntity.addPart("message", body);

并且字符串部分出现了Content-type标题,现在符号被正确编码和解码。