Android 通过多端口发送Unicode字符

Android 通过多端口发送Unicode字符,android,apache,http,utf-8,multipartform-data,Android,Apache,Http,Utf 8,Multipartform Data,我有一种方法,可以使用MultipartEntity内容类型将图像和文本作为HttpPost发送。对于英文符号,一切都很好,但对于unicode符号(例如Cyrlics),它只发送???。所以,我想知道,如何正确设置多端口的UTF-8编码,因为我已经尝试了几种解决方案,建议这样做,但没有一种有效。 以下是我已经说过的: HttpClient httpclient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(url);

我有一种方法,可以使用MultipartEntity内容类型将图像和文本作为HttpPost发送。对于英文符号,一切都很好,但对于unicode符号(例如Cyrlics),它只发送???。所以,我想知道,如何正确设置多端口的UTF-8编码,因为我已经尝试了几种解决方案,建议这样做,但没有一种有效。 以下是我已经说过的:

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")));

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

我研究了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;
所以,这似乎是ApacheLib中的某种bug/feature,它只允许将内容类型头添加到MultipartEntity的一个部分,如果这个部分的filename不为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);

字符串部分出现了内容类型标题,符号现在已正确编码和解码。

我用另一种方法解决了它,使用:

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

您可以使用下线在多部分实体中添加零件

entity.addPart(“数据”,新的StringBody(数据,Charset.forName(“UTF-8”))


在请求中发送unicode。

您正在使用“默认字符集”进行IO操作,无论您使用的是什么。Sun的设计很糟糕,如果您处理写/读字符串,必须始终使用指定编码的OutputStreamReader/InputStreamWriter。@Donaudampfschifffreizeitfahrt您好!请您更具体一点,我如何在我的问题中使用InputStreamWriter?我们将不胜感激。谢谢。哦,伙计,当然应该是OutputStreamWriter和InputStreamReader。httpclient必须具有主体类型接受编写器,但我现在没有库。只需搜索那些类名。@Donaudampfschifffreizeitfahrt感谢您的解释,但似乎没有帮助,请查看我的更新问题,如果我误解了您的建议,请纠正我。