2014-09-04 69 views
1

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

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 我试图用的InputStream按@Donaudampfschifffreizeitfahrt建议。现在我得到了 个字符。

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

也试过:

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

您正在使用'默认字符集'进行IO操作,无论您是使用什么操作。这是来自Sun的一个糟糕的设计,你必须**总是**使用OutputStreamReader/InputStreamWriter与指定的编码,如果你处理写/读字符串。 – 2014-09-04 12:15:22

+0

@Donaudampfschifffreizeitfahrt您好!你能更具体一点,我怎么能在我的问题的上下文中使用InputStreamWriter?示例将不胜感激。谢谢。 – mol 2014-09-04 12:34:55

+0

呵呵,应该是OutputStreamWriter和InputStreamReader。 httpclient必须具有Body类型接受Writer,但我现在没有该库。只需搜索这些类名称即可。 – 2014-09-04 12:39:18

回答

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 /功能,它只允许将Content-type标头添加到MultipartEntity的一部分,如果该部分的文件名不为空。所以我修改我的代码为:

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

并且内容类型头部出现在字符串部分,符号现在被正确编码和解码。

1

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

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

可以在多实体

entity.addPart( “数据”,新StringBody(数据,字符集使用以下行添加零件。的forName( “UTF-8”)));

要求发送unicode。